AwkまたはSed:パターンが見つかった場合:行を削除して変数をエクスポートする

AwkまたはSed:パターンが見つかった場合:行を削除して変数をエクスポートする

debug: Debug私のbashscriptでSedがファイルを見て発見${SourceP}したら、その行を削除して環境にエクスポートしたいと思います。Debug=Debug

sed -i '/debug: Debug/,+0 d' ${SourceP} && export Debug=Debug

しかし、残念ながらDebug=Debugパターンが見つからなくてもエクスポートされます。

これを達成するには:Debug=Debugパターンが見つかった場合にのみ行をエクスポートして削除します。

sedは使えませんか?


私はこれを試しましたが、awkそのうちの1つも動作しません。

awk -i inplace '!/debug: Debug/' ${SourceP} && export Debug=Debug

編集:正確に検索できたらと思いますdebug: Debug

答え1

awkどういうわけか部品から情報を抽出する必要があります。変数をエクスポートまたは使用できます。終了ステータス

awk -i inplace 'BEGIN {err = 1}; {if (NR == 1 && /([[:space:]]|^)debug: Debug([[:space:]]|$)/) {err = 0} else {print}}; END {exit err}' ${SourceP} && export Debug=Debug

説明する

  • BEGIN {err = 1}:最初はエラー状態を1に設定します。
  • 次に、最初の行にあり、NR == 1その行に&&エラーがある場合は、/([[:space:]]|^)debug: Debug([[:space:]]|$)/エラー状態を0(err = 0)に設定します。それ以外の場合は、他のすべての行を印刷します。この正規表現はdebug: Debugスペースまたは行の先頭で始まり、スペースまたは行の終わりで終わります。
  • スクリプトが終了するとawkエラー状態で終了します{exit err}
  • したがって/debug: Debug/、そのファイルで見つかった場合、エラー状態はゼロになり&&実行されます。

答え2

test "$(sed -i -e '/debug: Debug/{w /dev/fd/1' -e 'd}' "$SourceP")" && export Debug=Debug

メモ:

文は${SourceP}純粋な飾りです。それは単純さと同じくらい危険です$SourceP。欲しい引用する次に変更します:"$SourceP"または"${SourceP}"

/dev/fd/1ほとんどの最新のUnixでサポートされており、GNU専用であり、移植性が非常に低いですsed -iawk -i

関連情報