1

UNIXの文字列からパターンの前の単語を抽出したかったのですが、どうすればこれを実現できますか?

例:文字列が「sv_z = sample.scr」であるとすると、「。scr」を検索する必要があります。文字列で見つかった場合は、その単語全体を抽出する必要があります。この例では、出力はsample.scrである必要があります。単語に到達するための区切り文字は、空白、二重引用符、またはに等しいものにすることができます。

さらにいくつかの例を示します。

sv_z=sample.scr
sv_z=urhk_dbCall("sample.scr")
sv_z="sample.scr"

これが私の期待される出力です:

sample.scr
sample.scr
sample.scr
4

3 に答える 3

2

を使用する 1 つの方法を次に示しgrepます。

grep -o '[^ "=]*\.scr' file

説明:

  • -oフラグはパターンと正確に一致します。
  • [ ... ]文字クラスです。このクラスの最初の文字としてカラット ( ^) が使用されている場合、それはクラスの否定であり、実質的に「次の文字のいずれでもない」ことを意味します。
  • *最後の文字が何であれ、ゼロ回または任意の回数一致します。

編集:

あるいは、より厳密さが必要な場合は、Perl-regex と正の先読みが必要になります。以下の例では、これにより、一致の後に二重引用符、スペース、または行末が続くことが保証されます。*また、星印 ( ) をプラス記号 ( ) に変更することもできます+。これは、1 回以上の一致を意味します。したがって、これは次のようなものを除外します: .scr. しかし、入力例からは、ここで何を探しているのか正確にはわかりません。幸運を。

grep -oP '[^ "=]*\.scr(?=("| |$))' file
于 2012-11-29T12:13:29.160 に答える
0

別の解決策:

 awk -F= 'NR==1{print $2}{FS="\""}NR>1{print $2}' file
于 2012-11-29T21:41:37.057 に答える
0

この awk スクリプトでは、変数「d」を使用して、許可された区切り文字のリストを含め、スクリプト内で複数回繰り返すことを保存しています。

$ cat file
sv_z=sample.scr
sv_z=urhk_dbCall("sample.scr")
sv_z="sample.scr"
sv_z="unscrambled"
sv_z="sample.scrambled"

$ awk -v d=' "=' 'match($0,"["d"][^"d"]+\.scr(["d"]|$)") { $0=substr($0,RSTART,RLENGTH); gsub("["d"]",""); print NR, $0 }' file
1 sample.scr
2 sample.scr
3 sample.scr

投稿された grep -o ソリューションと比較してください。

$ grep -n -o '[^ "=]*.scr' file
1:sample.scr
2:sample.scr
3:sample.scr
4:unscr
5:sample.scr

おそらく grep の出力に含めたくない最後の 2 行に注意してください。

于 2012-11-29T18:24:02.147 に答える