私はsedに対応したいと思います:。出力に対して追加の処理を実行したいとします。このステップは、おそらくより長いsed式を追加すると、より複雑になるタスクの最初の部分です。grep -Eo 'regex'
; s…
もっと明確に言えば、それぞれを分離できるようにしたいです。ひも 入力ストリームに提供された正規表現と一致します。概念を証明するために、これらの各文字列はコンテキストなしで別々の行に出力する必要があります(つまり、入力に周囲のテキストはありません)。したがって、複数の(重複しない)一致がある入力行は複数の出力行を生成し、一致がない入力行は出力を生成しないでください。
例:
正規表現: [a-zA-Z]{3}[0-9]{4}
(つまり、3文字の後に4つの数字が続きます)
入力する:
FGH1234 and CAS4057
MAX2345
出力:
FGH1234
CAS4057
MAX2345
ベストアンサー1
長さゼロの正規表現の一致動作を修正するように更新されました。
sed 't match;s/REGEX/\n&\n/g;D;:match;/^\n/!P;s/\n//;D' file
一致をグローバルに置き換えます。次に、一致するすべての部分が印刷されるまで<newline><matched part><newline>
ループを作成して印刷します。空でない一致のみを印刷するには(GNUのように)、justの代わりにjustを使用してください。P;s/\n//;D
t match
/^\n/!P
P
grep -o
同様の方法を使用awk
できます。
regex='REGEX' awk 'BEGIN {FS="\n"}
gsub(ENVIRON["regex"], FS "&" FS) {for (i=2;i<NF;i+=2) if ($i!="") print $i}
' file
元の試行:.*
空の文字列に一致する正規表現(たとえば)が与えられた場合、これらのコマンドは正しく機能しません。空行は無限ループで印刷されます。
ワンコールでsed
:
sed '
t match
s/[[:alpha:]]\{3\}[[:digit:]]\{4\}/\
&\
/;D;:match
P;D' file
POSIX構文の使用:正規表現は、代替文字列でエスケープされた改行を使用し、分岐ラベルの後に改行を使用するデフォルトの正規表現sed
です。一部のバージョン(GNU sedなど)では、1行にすべてのスクリプトを許可できます。\
s///
;
sed
sed 't match;s/[[:alpha:]]\{3\}[[:digit:]]\{4\}/\n&\n/;D;:match;P;D' file
置換は、一致する部分の前後に改行文字を追加して、最初の一致を分離します。t match
スクリプトの先頭の条件分岐は、置換が成功した後にのみ続きます。:match
一致する部分が印刷される場所です。D
パターン空間から一致を含む行を削除し、残りを次のループの入力として使用して、より多くの一致を見つけることができるようにします。