我无法想象如何告诉sed dot match new line:
echo -e "one\ntwo\nthree" | sed 's/one.*two/one/m'
我希望得到:
一
三
相反,我得到了原创:
一个
2
3
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)
如果您使用 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部分确保您的输入被解码并正确地重新编码回输出。