条件付きパターンの検索

条件付きパターンの検索

単語を探したい巨大なファイルがあります。pattern。私は例えば私の状況を説明しようとしました。

私のファイルのどこかに私が持っているとしましょう。

Sample-pattern="abc"

Sampleハイフンの前の単語abcと引用符の中の単語をエコーするスクリプトを作成したいと思います。

だからあれば

Sample2-pattern="xyz"

それは鳴りますSample2xyz

patternその単語がファイルの他の場所にある可能性があります。ただし、pattern単語の前にハイフン以外の文字がある場合、スクリプトはこれを無視する必要があります。たとえば、次のような場合

Sample3pattern.....

これを無視する必要があります。

答え1

入力がありますfile.txt

Sample-pattern="abc"
Sample2-pattern="xyz"
Sample3pattern="def"

次のsedスクリプトは、次の出力を生成します。

$ sed -E -n -e '/-pattern/ s/^([^-]*)-[^=]*="([^"]*)"/\1 \2/p' file.txt
Sample abc
Sample2 xyz

上記のスクリプトは、sed1行の最初の文字の前のすべてのテキストと1行-の最初の文字の後の二重引用符内のすべてのテキストを印刷します。=正規表現と一致しない行は印刷されません(/-pattern/アドレス指定とs///検索と置換の両方)。

注:拡張正規表現を有効にするには、-Eオプションを使用します。これはsedGNU、* BSD、Mac OSでsed動作します。近い将来にはPOSIX標準になります。-E-rsed-E

デフォルトの正規表現バージョンは次のとおりです。

sed -n -e '/-pattern/ s/^\([^-]*\)-[^=]*="\([^"]*\)"/\1 \2/p'

答え2

grepGNU(Linuxのデフォルト)にアクセスできる場合は、次のことができます。

grep -Po '\w+-pattern="[^"]+' file

空白以外のすべての文字に一致できる-E拡張正規表現を有効にします。行の一致部分\Sのみが-o印刷されます。grep正規表現自体は、1つ以上の空白以外の文字(\S+)を検索し、-pattern="1つ以上の空白以外の"文字([^"]+)を探します。したがって、次のファイルが提供されます。

$ cat file
Sample-pattern="abc"
Sample2-pattern="xyz"
Sample3pattern="foo"

このgrepコマンドは以下を返します。

$ grep -Eo '\S+-pattern="[^"]+' file 
Sample-pattern="abc
Sample2-pattern="xyz

その後、次の方法でsed削除できます-pattern="

$ grep -Eo '\S+-pattern="[^"]+' file | sed 's/-pattern="/ /'
Sample abc
Sample2 xyz

関連情報