次の行を含むテキストファイルがあります(最後の2つの文字列のみが重要です)。
1 sometext Pattern
2 sometext Pattern 5Asda5}
3 sometext Pattern asd2-asd
4 sometext Pattern a-d
5 sometext Pattern foobar
6 sometext Pattern {asd
7 Pattern Pattern something 123asd
8 Pattern sometext asd
9 Pattern 5h{1,2}b
最後の単語として「Pattern」を含むすべての行を見つける必要があります。この場合、単語は文字とハイフンを含む文字列として定義されます。文字列の後に先行スペースがある場合があります(例:Pattern¥t¥t¥t¥t¥t$)。
これに対する私の見解は次のとおりです。
egrep '(\bPattern\b +[^a-zA-Z\-]{2,} *$)|(\bPattern\b *$)' file.txt
後にスペースが続くパターンがあるすべての行と、最後に「単語」ではなくパターンまたはパターンがある行を探します。しかし、最初の部分は期待どおりに機能しません。単語以外のものを見つけるための別の方法が必要です。
残りの行の代わりに1、2、3、6、9行をgrepする方法を教えてください。私はawkを授業時間に扱わないので遠くにしたいと思います。
答え1
\b
これをサポートする実装では、単語文字(数字と下線)と単語以外の文字(またはその逆)の間のgrep
変換に使用されます。たとえば、\bPattern\b
一致します。foo-Pattern.bar
スペースを区別して探している場合模様一言で言うことはできません\b
。
Pattern
ここでは、文字以外の文字を含むゼロ個以上のスペースで区切られた文字列のリストが、次のスペース区切り文字を探しているようです-
。したがって、次のようになります。
non_word='([^[:blank:]]*[^[:blank:][:alpha:]-][^[:blank:]]*)'
grep -E "(^|[[:blank:]])Pattern([[:blank:]]+$non_word)*[[:blank:]]*$"