在包含如下行的文件中:
# lorem ipsum blah variable
我想#
就地删除包含特定字符串的同一行中的(注释)字符。sed
这个有好处吗?
我正在努力让这个条件起作用。我有一个“笨拙”的方法来做到这一点;我可以用awk
或找到匹配的行号sed
,然后在单独的sed
命令中使用该数字,但我相信可以用更好的方式做到这一点。
答案1
使用您正在查找的字符串作为要操作的行的选择器:
sed '/ipsum/s/#//g'
/ipsum/
选择包含“ipsum”的行,并且仅在这些行上执行后面的命令。您可以使用大括号来运行更多命令
/ipsum/{s/#//g;s/@/-at-/g;}
答案2
$ cat input.txt
# lorem ipsum blah variable
# lorem ipsum blat variable
# lorem ipsum blow variable
# lorem ipsum blip variable
# lorem ipsum blue variable
然后:
$ sed 's|# \(.*blue.*\)|\1|' input.txt
给出:
# lorem ipsum blah variable
# lorem ipsum blat variable
# lorem ipsum blow variable
# lorem ipsum blip variable
lorem ipsum blue variable
其工作原理如下:
告诉s
它sed
应该替换正则表达式找到的内容。
该模式# \(.*blue.*\)
可分解为:找到一个哈希值,后跟一个空格。括号 ( \(
) 开始分组。.*blue.*
是一个词,blue
前面和后面都有任何东西。下一个括号 ( \)
) 结束分组。
替换是\1
which 是对第一个分组括号内容的反向引用。
答案3
您可以使用 POSIX 工具ex
:
ex a.txt <<eof
/Sunday/ sub/Sun//
xit
eof
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
答案4
您可以按如下方式执行此操作。
sed '/ipsum/s/^# //g'
这会匹配所有包含注释的行ipsum
,并从行首删除注释。^
匹配行首并$
匹配行尾。该命令的其余部分使用语法sed 's/find/replace/g'
,可以调用以将文件编辑为 sed -i '/ipsum/s/^# //g' file
.
您可以按如下方式逆转此过程:
sed '/ipsum/s/^/# /g'
这将在包含 的每一行的开头添加注释ipsum
。