次のような文字列があります:testfsdfsdftestfsdkflsdtestsdfsdfsdf
testfsdfsdf
次のように、最初の行に表示され、testfsdkflsd
2 行目にも表示されるように文字列を分割する方法を知りたいです。
testfsdfsdf
testfsdkflsd
testsdfsdfsdf
を使用して、その後に続くものをsed
検索しようとしましたが、再度印刷する方法がわかりません。 を使用すると、特定の文字列を検索し、それを別の文字列に置き換えることができるとわかっています。つまり、 のようなものを試したかったのですが、 を使用すると、 だけが出力されます。 で見つかった文字列を再印刷する方法はありますか、それとも別のコマンドでこれを行うことはできますか?test
sed 's/test.*/
test.*
sed
sed 's/test.*/[reprint test.* here]\n/g'
sed 's/test.*/test.*\n/g'
test.*
sed
's/\(test.*\)test/\1\ntest/g'
また、 のインスタンスが 2 つしかない場合は機能しますtest[random characters]
が、 が 3 つ以上ない場合はsed も試しました。文字列 の場合はtestfsdfsdftestfsdkflsdtestsdfsdfsdf
、次の内容のみが出力されます。
testfsdfsdftestfsdkflsd
testsdfsdfsdf
答え1
近づいてきました。必要なsedコマンドは
sed 's/test/\ntest/g'
各 の先頭に改行文字を追加しますtest
。
\n
さて、GNU sedやおそらく他のものもそうしているが、改行としての解釈はPOSIXコマンドを移植可能にするには、リテラルのエスケープされた改行が必要です。
sed 's/test/\
test/g'
test
ただし、例のように、が行の最初の4文字である場合、出力の先頭に空行が作成されることに気付くでしょう。それが起こらないようにするには、次のようにします。
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'
が、 のインスタンスが 2 つしかない場合は機能しますtest
が、 が 3 つ以上ない場合は機能します。
これは.*
貪欲なため、つまり、できるだけ多くの一致をしようとするためです。たとえば、
grep --color=always "b.*b" <<< abcabcabc
最初から最後まですべてを色分け/一致させる最後 b
。