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

Kam*_*mil 29 sed

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

# lorem ipsum blah variable
Run Code Online (Sandbox Code Playgroud)

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

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

pet*_*rph 54

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

sed '/ipsum/s/#//g'
Run Code Online (Sandbox Code Playgroud)

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

/ipsum/{s/#//g;s/@/-at-/g;}
Run Code Online (Sandbox Code Playgroud)

  • 我同意; 这是最好的答案(虽然不是唯一的)。注释: (1) `'s/#//g'` 将删除_所有_行中的 `#` 字符。如果这不是您想要的,请删除`g`(代表“全局”)。(2) 要就地编辑文件(如问题中所要求),请使用`sed -i`。 (4认同)
  • (3) 在现实世界中,如果您想取消注释一行,您可能需要使用 `sed -i '/ipsum/s/#[[:space:]]*//'` , 去掉紧跟在 `#` 后面的任何空格和制表符。(4) 您可能还需要考虑验证 `#` 是该行中的第一个非空白字符。当前命令将从`prompt "Enter # of ipsums:"`行中删除`#`。 (2认同)
  • @G-Man - 很棒的补充!到你的第二个点(前导空格),怎么样:`sed -i '/ipsum/s/^#[[:space:]]*//'`?!(`^` 表示行首,`$` 表示行尾)-至少在 gnu sed 中... (2认同)

gar*_*Red 8

$ cat input.txt
# lorem ipsum blah variable
# lorem ipsum blat variable
# lorem ipsum blow variable
# lorem ipsum blip variable
# lorem ipsum blue variable
Run Code Online (Sandbox Code Playgroud)

然后:

$ sed 's|# \(.*blue.*\)|\1|' input.txt
Run Code Online (Sandbox Code Playgroud)

给出:

# lorem ipsum blah variable
# lorem ipsum blat variable
# lorem ipsum blow variable
# lorem ipsum blip variable
lorem ipsum blue variable
Run Code Online (Sandbox Code Playgroud)

它的工作原理如下:

s告诉sed它应该替代正则表达式找到什么。

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

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