文件中的行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2000 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2001 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2002 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
注释掉让我们说包含的行
2001
Run Code Online (Sandbox Code Playgroud)
我可以简单地运行这个SED命令:
sed -i '/ 2001 /s/^/#/' file
Run Code Online (Sandbox Code Playgroud)
但现在我该怎么回复?
在取消注释同一行?
我试过了
sed -i '/ 2001 /s/^//' file
Run Code Online (Sandbox Code Playgroud)
这不起作用.
JNL*_*NLK 78
是的,要用sed评论包含特定字符串的行,只需执行以下操作:
sed -i '/<pattern>/s/^/#/g' file
Run Code Online (Sandbox Code Playgroud)
并取消注释:
sed -i '/<pattern>/s/^#//g' file
Run Code Online (Sandbox Code Playgroud)
在你的情况下:
sed -i '/2001/s/^/#/g' file (to comment out)
sed -i '/2001/s/^#//g' file (to uncomment)
Run Code Online (Sandbox Code Playgroud)
最后的选项"g"意味着全球变化.如果您只想更改单个模式实例,请跳过此步骤.
Avi*_*Raj 47
试试这个sed
命令,
sed -i '/^#.* 2001 /s/^#//' file
Run Code Online (Sandbox Code Playgroud)
为了补充@Avinash Raj的有用的答案有一个更通用的,POSIX兼容的解决方案.
请注意,该解决方案是awk
基于的,因为由于POSIX的基本正则表达式的限制,几乎不可能实现强大的可移植解决方案.sed
awk -v commentId='#' -v word='2001' '
$0 ~ "(^|[[:punct:][:space:]])" word "($|[[:punct:][:space:]])" {
if (match($0, "^[[:space:]]*" commentId))
$0 = substr($0, RSTART + RLENGTH)
else
$0 = commentId $0
}
{ print }
' file > tmpfile.$$ && mv tmpfile.$$ file
Run Code Online (Sandbox Code Playgroud)
(^|[[:punct:][:space:]])
并且($|[[:punct:][:space:]])
是从其他正则表达式方言中已知的POSIX扩展正则表达式\<
和\>
字边界断言.awk
不提供就地更新(偶尔也不提供POSIX sed
),因此输出首先在临时文件中捕获,然后该文件在成功时替换原始文件.