ファイルに正しい行がある場合は削除し、残りの行は保持します。エラー処理 - 処理方法

ファイルに正しい行がある場合は削除し、残りの行は保持します。エラー処理 - 処理方法

テキスト処理をどうすれば良い方法なのかよく分からないのでお会いしましょう。

次のファイルがあります。~/.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

通常、grep1つ以上の行がユーザーが提供したREと一致する場合、0(true)が返されます。この-vフラグはこれを反転するため、grepREと一致しないすべての行は成功したと見なされます。この場合、一致が失敗する唯一のケース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として扱われます。

おすすめ記事