次の内容を含むファイルがあるとします。
some:text:!someothertext
another:text:!!anothertext
「!」が一度だけ現れるテキスト行だけを探したい。
これが私が持っているもので動作するようですが、より良い方法があるかどうか疑問に思います。
grep -E ':![^!]' my_tex.txt
ベストアンサー1
awk
以下のおよびitを使用して、各行の感嘆符gsub()
の数を計算します。このコマンドは、感嘆符が1つだけ含まれている行のみを出力します。&
一致する感嘆符を自分のものに置き換えます。
awk 'gsub("!","&") == 1' file
tr
Perlとその演算子を使用して同様の操作を実行できます。
perl -ne 'print if tr /!/!/ == 1' file
grep
次のようにすれば、賢く努力する必要はありません。
grep -F '!' file | grep -v '!.*!'
つまり、単一の感嘆符を含む行を抽出した後、複数の感嘆符を含む行を削除します。これには2つのコマンドをパイピングすることが含まれますが、パイピングの目的は明らかであるため、多くの状況で役に立ちます。特定の部分文字列を避けたいのですが、それでもこのようなことを許可するには、grep
2番目のコマンドを単純化できますgrep
。grep -v -F '!!'
!!
!hello!