次の行を含む test.txt ファイルがあります。
values = abc, def, dfg, ert, sdf, sfd, sdf
test、txtの値に新しいコンマ区切り値を追加するためにシェルスクリプトを使用しています。
たとえば、私は必要です次へ追加test.txtの「ghf」:
values = abc, def, dfg, ert, sdf, sfd, sdf, ghf
値も削除する必要があります。
たとえば、私が必要な場合削除するtest.txtの "ert":
values = abc, def, dfg, sdf, sfd, sdf, ghf
シェルスクリプトでこれをどのように達成できますか?
(つまり)
私がくれたら
echo "abc" >> test.txt
ファイルの末尾に「abc」を追加できますが、test.txtの「values =」フィールドに追加する必要があります。
ありがとう、
ハリー
答え1
極端な状況に備えずに迅速なソリューションを提供します。
(ありがとうございます。グレンジャックマン最適化に使用されますsed
。 )
次へ追加
sed -i "/^values = / s/$/, ${NEW_VALUE}/" test.txt
説明する
sed -i
- で印刷せずに指定したファイルを変更しますstdout
。
/^values = /
-sed
で始まる行にあるときvalues =
。
s/$/, ${NEW_VALUE}/
-, ${NEW_VALUE}
行末に追加されます。
test.txt
sed
- 作業が実行されるファイルです。
削除する
sed -i "/^values = / s/ ${REMOVE_VALUE},\?//" test.txt
説明する
s/ ${REMOVE_VALUE},\?//
- 最初の項目とオプションの後続の${REMOVE_VALUE}
項目を削除します,
。
このソリューションの問題
- 最初の値を追加すると
,
すぐに追加されます。values =
- 最後の値を削除すると、.で終わる行が残ります
,
。 - 追加/削除された変数にコマンド
sed
の区切り文字s
(例では該当/
)が含まれていると、コマンドは機能しません。
答え2
使用すると、ed
次のことができます。
ed -s test.txt <<<$'/values/s/$/,ghf\nw' # add ghf to the end of line
そして
ed -s values <<<$'/values/s/ert,//\nw' # remove ert