bash 您所在的位置:网站首页 怎么把注释删掉 bash

bash

2024-07-15 22:49| 来源: 网络整理| 查看: 265

假设“在一个字符串中”意味着“出现在一对引号之间,无论是单引号还是双引号”,这个问题可以改写为“删除第一个未引用的 # 之后的所有内容”。反过来,您可以将带引号的字符串定义为两个引号之间的任何内容,反斜杠引号除外。作为一个小的改进,将整行替换为第一个未引用的 # 之前的所有内容。

所以我们得到了类似[^\"'#]普通情况的东西——一段既不是注释符号,也不是反斜杠,也不是开头引号的字符串。然后我们可以接受一个反斜杠后跟任何内容:\\.-- 这不是文字点,而是文字反斜杠,后跟一个匹配任何字符的点元字符。

然后我们可以允许引用字符串的零次或多次重复。为了接受单引号或双引号,每个引号允许零个或多个。带引号的字符串应定义为开引号,后跟零个或多个反斜杠任意字符或除右引号之外的任何字符:"\(\\.\|[^\"]\)*"或类似的单引号字符串'\(\\.\|[^\']\)*'。

将所有这些拼凑在一起,您的sed脚本可能如下所示:

s/^\([^\"'#]*\|\\.\|"\(\\.\|[^\"]\)*"\|'\(\\.\|[^\']\)*'\)*\)#.*/\1/

但是因为它需要被引用,并且单引号和双引号都包含在字符串中,所以我们需要额外的复杂性。回想一下,shell 允许您将字符串粘合在一起,例如用双引号和单引号"foo"'bar'替换为foobar-- 。因此,您可以通过将单引号放在与单引号字符串相邻的双引号中来包含单引号 - 在双引号旁边的单引号中,因此; 并且可以表示为与 相邻。因此,包含两个双引号的单引号字符串可以用相邻引用,或者,对于这种情况,可能更现实地是相邻foobar'"foo"'"'""foo"'"foo"'"''"'"'"foo"'bar'foo"'"'bar"'foo"'"'"与另一个单引号字符串相邻'bar',产生'foo'"'"'bar'.

sed 's/^\(\(\\.\|[^\#"'"'"']*\|"\(\\.\|[^\"]\)*"\|'"'"'\(\\.\|[^\'"'"']\)*'"'"'\)*\)#.*/\1/p' file

这是在 Linux 上测试的;在其他平台上,sed方言可能略有不同。例如,您可能需要在分组和更改运算符之前省略反斜杠。

唉,如果你可能有多行引用的字符串,这将不起作用;sed,按照设计,一次只检查一个输入行。您可以构建一个复杂的脚本,将多行收集到内存中,但是到那时,切换到例如 Perl 开始变得很有意义。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有