単語を探したい巨大なファイルがあります。pattern
。私は例えば私の状況を説明しようとしました。
私のファイルのどこかに私が持っているとしましょう。
Sample-pattern="abc"
Sample
ハイフンの前の単語abc
と引用符の中の単語をエコーするスクリプトを作成したいと思います。
だからあれば
Sample2-pattern="xyz"
それは鳴りますSample2
。xyz
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
上記のスクリプトは、sed
1行の最初の文字の前のすべてのテキストと1行-
の最初の文字の後の二重引用符内のすべてのテキストを印刷します。=
正規表現と一致しない行は印刷されません(/-pattern/
アドレス指定とs///
検索と置換の両方)。
注:拡張正規表現を有効にするには、-E
オプションを使用します。これはsed
GNU、* BSD、Mac OSでsed
動作します。近い将来にはPOSIX標準になります。-E
-r
sed
-E
デフォルトの正規表現バージョンは次のとおりです。
sed -n -e '/-pattern/ s/^\([^-]*\)-[^=]*="\([^"]*\)"/\1 \2/p'
答え2
grep
GNU(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