![如何让 sed 或使用另一个命令重新打印找到的字符串?](https://linux22.com/image/928963/%E5%A6%82%E4%BD%95%E8%AE%A9%20sed%20%E6%88%96%E4%BD%BF%E7%94%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%91%BD%E4%BB%A4%E9%87%8D%E6%96%B0%E6%89%93%E5%8D%B0%E6%89%BE%E5%88%B0%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9F.png)
我有一个像这样的字符串:testfsdfsdftestfsdkflsdtestsdfsdfsdf
我想知道如何分隔字符串,以便testfsdfsdf
出现在第一行,testfsdkflsd
出现在第二行等等,就像这样:
testfsdfsdf
testfsdkflsd
testsdfsdfsdf
我尝试使用sed
findtest
并在其后使用任何内容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
。