![sedを使用してキーワードを見つける場合は、一部の行を編集しますか? [コピー]](https://linux33.com/image/62239/sed%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%E4%B8%80%E9%83%A8%E3%81%AE%E8%A1%8C%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
特定のキーワードが見つかったら、行を編集したいと思います。
CS_CODE, SM_NUM, PORT_NUM, DEV_PORT_NUM, DIRNUM, MAIN_DIRNUM, BILL_NO, ADR_NAME
上記の行に「PORT_NUM」がある場合は、「BILL_NO」を「NA」に置き換える必要があります。行のキーワードのみを変更する必要があります。
私は次の方法を使用しています:
while IFS=$'\n' read -r line
do
if [[ $line == *"$string"* ]]; then
< sed command to replace only keyword >
fi
done < "$file"
この目標をどのように達成できますか?
注:「-i」拡張子は私のバージョンのsedでは機能しません。
答え1
sed
Menon、あなたはファイル全体を操作する方法に対する答えを得ました。コードスケルトンに示されているように、個々の行で作業する意図であれば、そのプログラムsed
(または他の外部プログラム)は必要ありません。シェルがおそらく(以下の説明を参照)、代替操作を実行するからです。string
コード内の変数に値(たとえば)が含まれていると仮定すると、PORT_NUM
変数の置換はline
次のように実行できます。
while read line
do
if [[ $line =~ $string ]]; then
line=${line/BILL_NO/NA}
fi
done < "$file"
(注:この代替品は、bash、ksh、zshなどの最新のシェルに適用されます。)