Sed --- 替换匹配行中的字符?

Sed --- 替换匹配行中的字符?

在包含如下行的文件中:

# 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

其工作原理如下:

告诉ssed应该替换正则表达式找到的内容。

该模式# \(.*blue.*\)可分解为:找到一个哈希值,后跟一个空格。括号 ( \() 开始分组。.*blue.*是一个词,blue前面和后面都有任何东西。下一个括号 ( \)) 结束分组。

替换是\1which 是对第一个分组括号内容的反向引用。

答案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

相关内容