我有一個像這樣的字串: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]
,而不是三個或更多實例,它就可以工作。對於 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
。