У меня есть строка вроде:testfsdfsdftestfsdkflsdtestsdfsdfsdf
Мне интересно, как разделить строку так, чтобы она testfsdfsdf
появилась в первой строке, testfsdkflsd
появилась во второй строке и т. д., вот так:
testfsdfsdf
testfsdkflsd
testsdfsdfsdf
Я пробовал использовать sed
find 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
.