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


21

在包含这样的行的文件中:

# lorem ipsum blah variable

我想#在包含特定字符串的同一行中删除(注释)字符。是否sed适合呢?

我正在努力使这个有条件的工作。我这样做有一种“笨拙”的方式。我可以用awk或找到匹配的行号,sed然后在单独的sed命令中使用该行号,但是我相信可以用更好的方法来完成。

Answers:


36

将您要查找的字符串用作要操作的行的选择器:

sed '/ipsum/s/#//g'

/ipsum/选择包含“ ipsum”的行,并且仅在这些行上执行后面的命令。您可以使用花括号来运行更多命令

/ipsum/{s/#//g;s/@/-at-/g;}

4
我同意; 这是最好的答案(尽管不是唯一的答案)。点评:(1)'s/#//g'将删除所有#行中的字符。如果这不是您想要的,请删除g(代表“ global”)。(2)要按位置编辑文件(按问题要求),请使用sed -i
G-Man说'Resstate Monica'2014/

2
(3)在现实情况下,如果要取消注释行,则可能要使用sed -i '/ipsum/s/#[[:space:]]*//'来消除紧跟在后面的任何空格和制表符#。(4)您可能还需要考虑验证the #是该行中的第一个非空白字符。当前命令#将从该行删除prompt "Enter # of ipsums:"
G-Man说'Resstate Monica'2014/

1
@ G-Man-非常棒!对于您的第二个点(前导空格),该怎么办:sed -i '/ipsum/s/^#[[:space:]]*//'?!(^表示行首,表示行$尾)-至少以gnu sed表示
Jeremy Davis

1
@JeremyDavis:是的,您可以将regex锚定到行的开头^,但这是错误的。我经常通过将缩进代码放在#代码之前来注释掉缩进代码,因此#缩进了。我怀疑我是唯一这样做的人。
G-Man说'Resstate Monica''Oct

1
@ G-Man-啊,是的,当然!谢谢,我没有考虑过。因此,您还想检查^&之间的空格#,因此更像这样:/ipsum/{/^[[:space:]]*#/s/#[[:space:]]*//}。尽管即使那样,#它仍然可能会引起问题(例如,在使用空格缩进/分隔的语言中)。
杰里米·戴维斯

7
$ 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对第一个分组括号中内容的反向引用。


3

您可以在Ex模式下使用Vim:

ex -sc '/ipsum/s/#//|x' file
  1. s 替代

  2. x 保存并关闭


太酷了。我不知道!TBH,我不确定这是否是此问题的最佳答案(IMO领先的sed答案是该答案),但它仍然很酷!感谢您的发布。
杰里米·戴维斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.