在 sed 中匹配空格或换行符

onl*_*rra 9 sed regular-expression

我已阅读并搜索,但我不明白它有什么问题,我想匹配:一个空格,字符串 00011,以及一个空格或一个新行。

sed 's:\(\s\)\(00011\)\([\s\n]\):\1$03\3:g'
Run Code Online (Sandbox Code Playgroud)

编辑:数据如下所示:

ADD    00000 00001 00011
LSH    00011 00100 01111
ADD    00011 10100 00010
JSR    00011101000111010101100010
Run Code Online (Sandbox Code Playgroud)

并且$03只是一个字符串来替换00011

我想以这样的方式结束:

ADD    00000 00001 $03
LSH    $03 00100 01111
ADD    $03 10100 00010
JSR    00011101000111010101100010
Run Code Online (Sandbox Code Playgroud)

谢谢

fil*_*den 7

sed 一次在一行上工作,它会在处理每一行时去除换行符。

因此,为了执行您想要的操作,您应该匹配行尾锚点 ( $) 而不是文字换行符。

这应该有效:

sed 's:\(\s\)\(00011\)\(\s\|$\):\1$03\3:g'
Run Code Online (Sandbox Code Playgroud)

  • @onlycparra 没错,`/g` 在这里没有帮助,因为匹配之间的空格将在第一个正则表达式的末尾匹配,因此在第二个正则表达式匹配的开始时不会考虑它。你可以自己测试一下。匹配单词边界在这里绝对更好! (2认同)

Kus*_*nda 6

$ sed 's/\<00011\>/$03/g' file
ADD    00000 00001 $03
LSH    $03 00100 01111
ADD    $03 10100 00010
JSR    00011101000111010101100010
Run Code Online (Sandbox Code Playgroud)

\<\>在一个单词的开始和结束的零宽度字边界匹配分别,。BSDsed也会识别[[:<:]][[:>:]],而 GNUsed也将其理解\b为单词边界。

sed永远不会看到输入数据中的换行符。此外,\s特定于 GNU sed。要匹配标准中的空格字符,sed只需使用文字空格(要匹配空格或制表符,请使用[[:blank:]])。