ワンライナー:
cat $1 | ./words_num word | cat $1
独特です。これは、次とほぼ同等です。
cat $1 | ./words_num word >/dev/null; cat $1
これは意図した結果である可能性は低いです。cat
また、UUOC (Useless Use of ) 賞の候補でもあります。
元のファイルを修正版で上書きすることが意図されている場合は、おそらく次のように記述する必要があります。
./words_num word < $1 > tmp.$$; mv tmp.$$ $1
画面にも結果を表示したい場合は、次のようにします。
./words_num word < $1 | tee tmp.$$; mv tmp.$$ $1
これらは両方とも、中断された場合に一時ファイルを残します。あなたはそれを避けることができます:
#!/bin/bash
trap "rm -f tmp.$$; exit 1" 0 1 2 3 13 15
./words_num word < $1 | tee tmp.$$
mv tmp.$$ $1
trap 0
トラップは、シグナル ハンドラー (EXIT、HUP、INT、QUIT、PIPE、TERM) を設定し、一時ファイル (存在する場合) を削除し、失敗状態で終了します。最後のtrap 0
は終了トラップをキャンセルするため、コマンドは正常に終了します。
words_num
スクリプトに関しては、それはシェルではなくを呼び出すようですawk
:
#!/bin/bash
[ $# == 0 ] && { echo "Usage: $0 word [file ...]" >&2; exit 1; }
word=$1
shift
awk "/$word/"' { print $0, NF; next } { print }' "$@"
スクリプトをゴルフするコードに興味がある場合は、それを減らすことができますが、標準awk
以下のコードよりも明確にすることをお勧めします。単語を含む行を探し、その行をその行のフィールド数とともに出力し、次の行に移動します。行が一致しない場合は、単純に印刷されます。"$@"
への他のすべての引数を含む代入とシフトは、指定されたファイルを自動的に循環するか、ファイルが指定されていない場合は標準入力を読み取ることを意味しwords_num
ますawk
。
スクリプトは、指定された単語にスラッシュが含まれていないことを確認する必要があります。これは、正規表現を混乱させるためです (表示される各単語を[/]
、スラッシュのみを含む文字クラスである に置き換えても問題ありません)。そのレベルの防弾は、関心のあるユーザーに委ねられています。