テキスト処理をどうすれば良い方法なのかよく分からないのでお会いしましょう。
次のファイルがあります。~/.config/mpv/input.conf
他のオプションも含めることができますv disable
。
ファイルからその行を削除するには、次のようにします。
grep -v -q -F 'v disable' input.conf; echo $?
1
ここで - ファイルに現在のような他のコンテンツが含まれていない場合は1(マニュアルページ「選択した行はありません。」と言います1
。シンプルif-statement
。
したがって、$?
コマンドの後に保存し、エラーがある場合は1より大きいことを確認する必要があります。
また、ファイルを適切な場所に変更するのが良いアイデアであるかどうかはわかりません。
grep ... input.conf > input.conf
他の方法があれば教えてください。また、私の提案のいくつかが正しいことを教えてください。
ありがとうございます。
編集1:
目的の動作は、行が存在する状態を切り替えることです(>>
行が存在することを確認してから、簡単な追加で実行します(削除、したがって質問))。
編集2:
許容されるソリューションはPOSIXと互換性がなければなりません。いいえバシズムまたは非POSIXツール。ただし、他の人に役立つ可能性がある非POSIXソリューションを含めることができます。とにかくありがとうございます。
ベストアンサー1
通常、grep
1つ以上の行がユーザーが提供したREと一致する場合、0(true)が返されます。この-v
フラグはこれを反転するため、grep
REと一致しないすべての行は成功したと見なされます。この場合、一致が失敗する唯一のケースv
は、ソースコードに1行しかあり、REと正確に一致する場合です。
したがって、一致する行を削除し、適用された変更の表示を返すのは少し複雑です。
remove='v disable'
if grep -qxF "$remove" input.conf
then
# Apply the removal, saving a backup
cp -fp input.conf input.conf.bak &&
grep -vxF "$remove" input.conf.bak >input.conf
# Do other things that are relevant if the line was removed
else
# Do things that are relevant if the line was not present
:
fi
の代替案バレンティン・バジラミ終わったコメントから使用ed
その場所からファイルを直接変更します。
if printf '%s\n' '/^v disable/d' wq | ed -s input.conf >/dev/null
then
# Do other things that are relevant if the line was removed
:
else
# Do things that are relevant if the line was not present
:
fi
この場合、一致する文字列はリテラルではなくREとして扱われます。