Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用sed脚本忽略注释(#),但保持行不变_Regex_Shell_Sed - Fatal编程技术网

Regex 使用sed脚本忽略注释(#),但保持行不变

Regex 使用sed脚本忽略注释(#),但保持行不变,regex,shell,sed,Regex,Shell,Sed,这与以下问题类似: 然而,不同之处在于,我没有使用一个替换,而是使用带有两个替换的sed脚本文件 我想我可以编辑脚本的每一行,使其符合以下格式: /^#/!s/orig/replace/g 然而,这对我来说似乎有点太多的复制和粘贴 还有更优雅的方式吗 我使用的脚本是: 您可以使用块: /^#/!{s/a/b/;s/c/d/} 可以使用块: /^#/!{s/a/b/;s/c/d/} 您可以在脚本中使用awk而不是sed吗?sed脚本包括: s/orig/replace/g s/\(foo\

这与以下问题类似:

然而,不同之处在于,我没有使用一个替换,而是使用带有两个替换的sed脚本文件

我想我可以编辑脚本的每一行,使其符合以下格式:

/^#/!s/orig/replace/g
然而,这对我来说似乎有点太多的复制和粘贴

还有更优雅的方式吗

我使用的脚本是:

您可以使用块:

/^#/!{s/a/b/;s/c/d/}
可以使用块:

/^#/!{s/a/b/;s/c/d/}

您可以在脚本中使用awk而不是sed吗?sed脚本包括:

s/orig/replace/g
s/\(foo\)bar/\1dog/
{
   $0=gensub(/orig/,"replace","g")
   $0=gensub(/(foo)bar/,"\\1dog","")
}
{ print }
可以逐行转换为GNU awk脚本:

s/orig/replace/g
s/\(foo\)bar/\1dog/
{
   $0=gensub(/orig/,"replace","g")
   $0=gensub(/(foo)bar/,"\\1dog","")
}
{ print }
然后,如果您不想处理以#开头的行,那么在进入操作块之前,只需对awk脚本进行一个小的调整即可测试该条件:

!/^#/ {
   $0=gensub(/orig/,"replace","g")
   $0=gensub(/(foo)bar/,"\\1dog","")
}
{ print }
下面是sed脚本中的前几次转换,如果您想这样做,可以使用这些转换:

# s=^"=`` =g
$0 = gensub(/^"/,"``","g")

# s=\([ ([{<]\)"=\1 `` =g
$0 = gensub(/([ ([{<])"/"\\1 ``","g")

# s=\.\.\.= ... =g
$0 = gensub(/\.\.\./," ... ","g")

# s=[,;:@#$%&]= & =g
$0 = gensub(/[,;:@#$%&]/," & ","g")

# s=\([^.]\)\([.]\)\([])}>"']*\)[       ]*$=\1 \2\3 =g
$0 = gensub(/([^.])([.])([])}>"']*)[    ]*$/,"\\1 \\2\\3","g")
#s=^=``=g
$0=gensub(/^”/“``”和“g”)
#s=\([([{']*\)[*$=\1\2\3=g
$0=gensub(/([^.])([.])([])}>“']*)[]*$/,“\\1\\2\\3”,“g”)

主要是您只需将sed中的
\(
)更改为awk中的
),并将sed中的
\1
更改为awk中的
\\1

您可以在脚本中使用awk而不是sed吗?sed脚本包括:

s/orig/replace/g
s/\(foo\)bar/\1dog/
{
   $0=gensub(/orig/,"replace","g")
   $0=gensub(/(foo)bar/,"\\1dog","")
}
{ print }
可以逐行转换为GNU awk脚本:

s/orig/replace/g
s/\(foo\)bar/\1dog/
{
   $0=gensub(/orig/,"replace","g")
   $0=gensub(/(foo)bar/,"\\1dog","")
}
{ print }
然后,如果您不想处理以#开头的行,那么在进入操作块之前,只需对awk脚本进行一个小的调整即可测试该条件:

!/^#/ {
   $0=gensub(/orig/,"replace","g")
   $0=gensub(/(foo)bar/,"\\1dog","")
}
{ print }
下面是sed脚本中的前几次转换,如果您想这样做,可以使用这些转换:

# s=^"=`` =g
$0 = gensub(/^"/,"``","g")

# s=\([ ([{<]\)"=\1 `` =g
$0 = gensub(/([ ([{<])"/"\\1 ``","g")

# s=\.\.\.= ... =g
$0 = gensub(/\.\.\./," ... ","g")

# s=[,;:@#$%&]= & =g
$0 = gensub(/[,;:@#$%&]/," & ","g")

# s=\([^.]\)\([.]\)\([])}>"']*\)[       ]*$=\1 \2\3 =g
$0 = gensub(/([^.])([.])([])}>"']*)[    ]*$/,"\\1 \\2\\3","g")
#s=^=``=g
$0=gensub(/^”/“``”和“g”)
#s=\([([{']*\)[*$=\1\2\3=g
$0=gensub(/([^.])([.])([])}>“']*)[]*$/,“\\1\\2\\3”,“g”)

主要是将sed中的
\(
更改为
在awk中,将sed中的
\1
更改为
\\1
在awk中。

是的,似乎不管我怎么做,我必须编写另一个unix工具命令管道来转换脚本。:)我实际上在想,你只需要花20分钟左右的时间将你的sed脚本手动转换为gawk,然后在它前面添加
!/^#/
。当然,这就是我要做的-只是想可能有一个简单的补充,我到目前为止还没有。我只是为你做了一些,让你走上正确的道路。确保你正在使用的是GNU awk,不是hough,由于其他AWK没有gensub(),因此从sed转换要困难得多,因为只有gensub()支持反向引用。是的,似乎不管我怎么做,我必须编写另一管道unix工具命令来转换脚本。:)我实际上在想,你只需要花20分钟左右的时间将你的sed脚本手动转换为gawk,然后在它前面添加
!/^#/
。当然,这就是我要做的-只是想可能有一个简单的补充,我到目前为止还没有。我只是为你做了一些,让你走上正确的道路。确保你正在使用的是GNU awk,不是hough,因为其他AWK没有gensub(),所以从sed转换要困难得多,因为它只有gensub()这支持反向引用。谢谢!我不知道在那一点上可以使用块…我转换了scipt,但是现在得到了
/bin/sed:file bin/tokenize2.sed行2:命令后的额外字符
我现在将逐行转换SKcript…@benroth:在一些非GNU sed中,您可能必须使用换行符而不是用于分离命令。现在效果很好!很好,很干净!谢谢!我不知道此时可以使用块…我转换了scipt,但现在得到了
/bin/sed:file bin/tokenize2.sed第2行:命令后的额外字符
我现在将逐行转换SKcript…@benroth:在一些非GNU sed中,您可能不得不这样做使用换行符而不是
来分隔命令。现在效果很好!又漂亮又干净!