Sed正規表現 - 生の一致を含める

Sed正規表現 - 生の一致を含める

入力する:

dsfgsdf8gfsd
2011.06.26. v
iudsfg98sdfg
sosdufgsdfg
2011.06.27. h
8xdofguiosdfg
jdasfhasd89fa
2011.06.28. k
ydsfgsdgsdg
dsfgdsfzfszgh
2011.06.29. sze
ds9fgisdfgsdfg
asdfasdfasddf
2011.06.30. cs
dsg789sdiofgsdg
dsfig89dsfgds
2011.07.01. p
sd9fg8sdgsdg
sdlfjgsd89öfgxcbv
dsglsd9gcxbv
dsflgjsdlfgfsdg
sdfsdfgdxfgxc
2011.07.02. szo
cvbdsgfsd
2011.07.03. v
dfgsdfgsd
2011.07.04. h
sdfgsdfgsdg

たとえば、sedを使用してこの出力をどのように取得できますか? (またはパール?)

2011.06.26. v
iudsfg98sdfg
sosdufgsdfg
----------
2011.06.27. h
8xdofguiosdfg
jdasfhasd89fa
----------
2011.06.28. k
ydsfgsdgsdg
dsfgdsfzfszgh
----------
2011.06.29. sze
ds9fgisdfgsdfg
asdfasdfasddf
----------
2011.06.30. cs
dsg789sdiofgsdg
dsfig89dsfgds
----------
2011.07.01. p
sd9fg8sdgsdg
sdlfjgsd89öfgxcbv
dsglsd9gcxbv
dsflgjsdlfgfsdg
sdfsdfgdxfgxc
----------
2011.07.02. szo
cvbdsgfsd
----------
2011.07.03. v
dfgsdfgsd
----------
2011.07.04. h
sdfgsdfgsdg

だから私は変更したいと思います:

2011.06.26. v

そして

2011.06.27. h

など:

----------
2011.06.26. v

そして

----------
2011.06.27. h

私はこれを試しました(笑わないでください:D):

sed "s/[0-9]\{4\}\.[0-9]\{2\}\.[0-9]\{2\}\. /WTF/g"

しかし、sedで「h、k、sze、cs、p、szo、v」を一致させる方法や、一致する内容を「WTF」(in ... / WTF / g」)に入れる方法がわかりません。

誰でもどんなアイデアがありますか? :\

ありがとうございます!

答え1

始点は次のsed行です。

$ echo 2011.06.26. v | sed 's/^\([0-9]\+\.[0-9]\+\.[0-9]\+\. \([hv]\|sze\)\)$/----------\n\1/'
----------
2011.06.26. v

()|+sedはデフォルトの正規表現構文(デフォルト)を使用するため、特殊な意味(グループ化、置換、1つ以上)を取得するには文字をエスケープする必要があります。\1最初のグループの試合への参照をもう一度参照してください。

答え2

以下を使用してこのソリューションを見つけましたsed

sed -n '/^[0-9]\{4\}\.[01][0-9]\.[0123][0-9]\./,${:a;N;$!ba;{s/\([0-9]\{4\}\.[01][0-9]\.[0123][0-9]\.\)/--------------\n\1/g;p}}'

欠点は、日付が2回一致する必要があることです。たぶん別の(より良い)解決策があるかもしれません。
出力は、例で予想したものとまったく同じです。

答え3

つまり、----------各行の前にYYYY.MM.DD日付を挿入し、その後にスペースと複数の小文字を挿入しようとします。これを行う方法はいくつかあります。挿入コマンド()を使用できますi

sed -e '/^[0-9][0-9][0-9][0-9]\.[0-9][0-9]\.[0-9][0-9] [a-z][a-z]*$/ i \
----------'

あるいは、行の先頭の空の文字列を改行文字に置き換えることもできます。

sed -e '/^[0-9][0-9][0-9][0-9]\.[0-9][0-9]\.[0-9][0-9] [a-z][a-z]*$/ s/^/----------\
'

あるいは、一致するパターンを表すためにコマンドの&代替テキストに使用できます。s

sed -e 's/^[0-9][0-9][0-9][0-9]\.[0-9][0-9]\.[0-9][0-9] [a-z][a-z]*$/----------\
&'

一部のsed実装では、代替テキストにバックスラッシュの代わりに改行文字を書き込むことができますが、\n他の実装\nでは\nまたはn

答え4

代わりにawkを使用する必要があります

awk ' /[0-9]{4}\.[0-9]{2}\.[0-9]{2}\. / { print "---------------------\n" $0 ; continue } /^/ { print $0 } ' <"INPUTFILE" >"OUTPUTFILE"

基本的には2段階で動作します。

ステップ1:/[0-9]{4}\.[0-9]{2}\.[0-9]{2}\. / { print "---------------------\n" $0 ; continue }

意味: /4digits.2digits.2digits と一致する場合。 / 次に、「---...--\n」に一致する行を印刷し、次の行で繰り返します(= "continue")。

ステップ2:/^/ { print $0 }

意味:上記と一致しない場合は、他のすべての行に対して(つまり、行の先頭に一致するため空白行も一致する)、その行を印刷するだけです。

関連情報