Как заставить sed или другую команду перепечатать найденную строку?

Как заставить sed или другую команду перепечатать найденную строку?

У меня есть строка вроде:testfsdfsdftestfsdkflsdtestsdfsdfsdf

Мне интересно, как разделить строку так, чтобы она testfsdfsdfпоявилась в первой строке, testfsdkflsdпоявилась во второй строке и т. д., вот так:

testfsdfsdf
testfsdkflsd
testsdfsdfsdf

Я пробовал использовать sedfind testи что-либо после него с , 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.

Теперь, хотя GNU sed и, возможно, другие это делают, интерпретация \nкак новой строки не определена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.

Связанный контент