下面的脚本着眼于在另一个名为 newfile.txt 的文件中打印 file1.txt 中第一次出现模式“Word1 word2”之后的任何文本:
sed -n -e 's/^.*Word1 word2/\1/p' file1.txt > newfile.txt
当我在终端中输入此内容时,没有任何反应(我也没有收到错误消息)。请注意,我在 Mac OS X 上使用 UNIX。
答案1
命令
sed -n -e 's/^.*Word1 word2/\1/p' file1.txt
定义不明确,因为替代命令的右侧包含反向引用,但左侧没有捕获组。 Linux 中的 GNU sed 4.7 给出错误消息“‘s’命令的 RHS 上的引用 \1 无效”。
由于要求打印第一次出现“Word1 word2”后的文本,因此我们不能仅仅使用,.*Word1 word2
因为这.*
是贪婪的。相反,我们将使用一个技巧,将第一个转换Word1 word2
为单个字符,然后删除到该字符为止。任何未使用的字符都可以,但换行符是一个不错的选择,因为 sed 在读取每一行时都会删除换行符,并在打印行时添加一个换行符。所以我们有
sed -n -e 's/Word1 word2/\n/;s/^.*\n//p' file1.txt > newfile.txt
如果需要“Word1 word2”,则使用
sed -n -e 's/Word1 word2/\n&/;s/^.*\n//p' file1.txt > newfile.txt