如何让 sed 或使用另一个命令重新打印找到的字符串?

如何让 sed 或使用另一个命令重新打印找到的字符串?

我有一个像这样的字符串:testfsdfsdftestfsdkflsdtestsdfsdfsdf

我想知道如何分隔字符串,以便testfsdfsdf出现在第一行,testfsdkflsd出现在第二行等等,就像这样:

testfsdfsdf
testfsdkflsd
testsdfsdfsdf

我尝试使用sedfindtest并在其后使用任何内容sed 's/test.*/,但我不知道如何重新打印test.*。据我所知sed,您可以使用它来查找特定字符串,然后将其替换为其他内容。所以本质上,我想尝试类似 的东西sed 's/test.*/[reprint test.* here]\n/g',但如果我这样做sed 's/test.*/test.*\n/g',它只会输出test.*。有什么方法可以重新打印使用 找到的字符串sed,或者可以使用另一个命令来完成吗?

我还尝试了 sed 's/\(test.*\)test/\1\ntest/g',如果只有两个 实例test[random characters],则它会起作用,但不会有三个或更多实例。对于字符串testfsdfsdftestfsdkflsdtestsdfsdfsdf,它只会打印:

testfsdfsdftestfsdkflsd
testsdfsdfsdf

答案1

你已经接近目标了。你想要的 sed 命令是

sed 's/test/\ntest/g'

它在每个 前面添加一个换行符test

\n现在,尽管 GNU sed 和其他可能的人这样做,但作为换行符的解释并没有被指定POSIX。为了使命令可移植,需要一个文字、转义的换行符,

sed 's/test/\
test/g'

但是,您会注意到,如果test是行的前四个字符(如您的示例所示),则将在输出开头创建一个空行。如果不这样做,我们可以使用

sed 's/\(.\)test/\1\ntest/g'

.test匹配任何字符,因此之前某个字符的存在必需的,否则正则表达式不匹配。即,如果test是行中的第一个字符串,则.无法匹配任何内容,也不会进行替换。

对于便携式替代品,

sed 's/\(.\)test/\1\
test/g'

使用 GNU sed 进行的一些测试:

$ sed 's/test/\ntest/g' <<< 'testfsdfsdftestfsdkflsdtestsdfsdfsdf'

testfsdfsdf
testfsdkflsd
testsdfsdfsdf
$ sed 's/\(.\)test/\1\ntest/g' <<< 'testfsdfsdftestfsdkflsdtestsdfsdfsdf'
testfsdfsdf
testfsdkflsd
testsdfsdfsdf

我也尝试了sed 's/\(test.*\)test/\1\ntest/g',如果只有两个实例test,则该方法有效,但三个或更多实例则无效。

这是因为.*它是贪婪的,也就是说,它会匹配所有它能匹配的。例如,

grep --color=always "b.*b" <<< abcabcabc

颜色/匹配一切从第一个到最后的 b

相关内容