怎么告诉sed"dot match new line"

the*_*eta 8 sed

我无法想象如何告诉sed dot match new line:

echo -e "one\ntwo\nthree" | sed 's/one.*two/one/m'

我希望得到:


相反,我得到了原创:

一个
2
3

kev*_*kev 5

sed是基于线的工具。我不认为这些是一种选择。
你可以使用h/H(hold),g/G(get)。

$ echo -e 'one\ntwo\nthree' | sed -n '1h;1!H;${g;s/one.*two/one/p}'
one
three
Run Code Online (Sandbox Code Playgroud)

也许你应该试试 vim

:%s/one\_.*two/one/g
Run Code Online (Sandbox Code Playgroud)


Wik*_*żew 5

如果您使用 GNU sed,则可以将任何字符(包括换行符)与仅匹配.,请参阅:

.
         匹配任何字符,包括换行符。

您需要使用的只是一个-z选项

echo -e "one\ntwo\nthree" | sed -z 's/one.*two/one/'
# => one
#    three
Run Code Online (Sandbox Code Playgroud)

请参阅在线sed演示

然而one.*two可能不是您所需要的,因为*在 POSIX 正则表达式模式中总是贪婪的。因此,one.*two将匹配最左边的one,然后匹配尽可能多的任何 0 个或多个字符,然后是最右边的two。如果您需要删除one,则尽可能少地删除 0+ 个字符,然后是最左边的two,您将必须使用perl

perl -i -0 -pe 's/one.*?two//sg' file             # Non-Unicode version
perl -i -CSD -Mutf8 -0 -pe 's/one.*?two//sg' file # S&R in a UTF8 file 
Run Code Online (Sandbox Code Playgroud)

-0选项启用slurp 模式,以便文件可以作为一个整体而不是逐行读取,-i将启用内联文件修改,s.匹配任何字符(包括换行符),并将.*?匹配任何 0 个或多个字符由于非贪婪而尽可能*?。该-CSD -Mutf8部分确保您的输入被解码并正确地重新编码回输出。