如何使 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],而不是三個或更多實例,它就可以工作。對於 string testfsdfsdftestfsdkflsdtestsdfsdfsdf,它只列印:

testfsdfsdftestfsdkflsd
testsdfsdfsdf

答案1

你很接近。你想要的 sed 指令是

sed 's/test/\ntest/g'

它在每個 前面加上一個換行符test

現在,儘管 GNU sed 和可能其他人這樣做,但作為換行符的解釋\n並未由POSIX。為了讓指令可移植,需要一個文字轉義換行符,

sed 's/test/\
test/g'

但是,您會注意到,iftest是該行的前四個字元(如您的範例所示),這將在輸出的開頭建立一個空白行。如果這種情況不會發生,我們可以使用

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

相關內容