気象降水量ファイルを生成するスクリプトは次のとおりです。
#!/bin/ksh
x=10
b=snow
c=rain
d=snow
e=hail
echo "$x,$b,$c,$d,$e" > weatherfile
exit 0
与えられた
3,8s/snow/dry/g
検索と置換の場合、この機能をスクリプトで実装する最良の方法は何ですか?
コマンドの観点から見ると必要ですかsed
?
私の考えは、次がうまくいくはずです。
sed 3,8s/snow/dry/g weatherfile
うまくいかない場合はsed
どうすればいいですか?ファイルを開いて閉じる必要がある場合と実行方法
:3,8s/snow/dry/g
ファイルが開いたら?実装方法は何ですか?
答え1
vim
ここでドキュメントと一緒にコマンドを直接使用することができます(これは不規則な置換に特に便利です)。
#!/bin/ksh
vim weatherfile <<EOF
:3,8s/snow/dry/g
:wq
EOF
答え2
次のスクリプトを使用して、シェルでこれを完全に実行できます。
#!/bin/bash
line_num=0
while IFS= read -r line
do
: $((line_num++))
if [[ line_num -ge 3 && line_num -le 8 ]]
then
printf "%s\n" "${line/snow/dry}"
else
printf "%s\n" "$line"
fi
done
(私はこれをbashでテストしましたアンドレレポートによると、kshでは機能しますが、すべてのPOSIX互換バージョンでは機能しませんsh
。 ) 標準入力から行を読みます。行数を計算します(行番号の範囲を指定するには、line_num=0
および使用します)。その要件を削除すると、引用符を削除できます。条件付きテスト: $((line_num++))
line_num
if [[ line_num -ge 3 && line_num -le 8 ]]
範囲3,8
、つまり3〜8に対応する「IF(line_num≥3)AND(line_num≥8)」を意味します。 (これは3,8
「3と8」を意味し、「3〜8」が意味すると期待するUnix初心者にとっては混乱する可能性があります。3-8
つまり、Windowsの印刷ダイアログボックスがドキュメントページのサブセットを印刷するために使用するルールです) .)
範囲内の行では、次を使用します。
${範囲/模様/ひも)
パラメータ拡張形式は、行を標準出力に書き込む前に「snow」を「dry」に置き換えます。範囲外の行は変更なしで記録されます。
これにより、範囲内の各行に最初に表示される「目」が変更されます(存在する場合)。すべての項目を置き換えるには${line//snow/dry}
(/
「snow」の前に追加の文字を挿入する)を使用します。
私はあなたが望む大きな絵を知りません。
- 上記のコードを既存のスクリプトに統合できます。
weather.sh
ファイルの代わりに標準出力に書き込むようにスクリプトを変更した場合(と呼ぶ)、次のように言うことができます。./weather.sh | ./do_substitute.sh > weatherfile
weatherfile
今と同じようにしてから変更したい場合は、これを行うだけです。./do_substitute.sh < weatherfile > weatherfile.tmp mv weatherfile.tmp weatherfile