sedコマンドで/を正しくエスケープする

sedコマンドで/を正しくエスケープする

$foo最初の位置パラメータを使用してからその行の前のすべての行を削除するスクリプトを作成しようとしています。ただし、引き続き次のエラーが発生します。私の意見は脱出しようとしましたが、役に立たなかったことです。また、テキストをエスケープするさまざまな方法を探しましたが、役に立ちませんでした。私のコードは次のとおりです$foofiles.txtsed: -e expression #1, char 22: unknown command: frecup_dir.6/f5681240.mpg/ recup_dir.6\/f5681240.mpg

foo=$1;
sed -i "0,/^file $foo$/d" files.txt

編集:質問をより明確にするために、次のファイルがあるとします。files.txt

file ab/c
file eg/f
file hi/j
file xy/z

これで、特定の要素の前にあるすべての要素を削除したいので、うまくhij機能するコマンドを使用します。sed -i '0,/^file hi\/j$/d' files.txt

ただし、上記のスクリプトの一部として使用しようとすると失敗します。./script.sh eg\/fエラーにより実行が失敗します。sed: -e expression #1, char 23: unknown command: `f'

ありがとう

ベストアンサー1

問題は、文字列にスラッシュ文字が含まれていることです。この文字は、シェルが式sedに挿入すると構文エラーを生成します(正規表現は早期に終了します)。

これを解決する1つの方法は、挿入する文字列のようにすべての/文字をエスケープすることですが、これは少し厄介です。\/別の方法は、文字列にない区切り文字を使用することです。

foo=$1
sed -i "1,\:^file $foo$:d" files.txt

区切り文字が最初に表示される場合は、式からエスケープする必要があります。これは0通常、範囲の有効な開始ではありません。

一致する行も出力するには:

foo=$1
sed -i "1,\:^file $foo$: { \:^file $foo$: p; d; }" files.txt

代替ソリューション:

awk -v file="$foo" 'output; $0 == "file " file { output = 1 }' files.txt

output変数がゼロでないか空白でない場合、各行が出力されます。コマンドラインに変数を提供する文字列が1行の後に来るたびに、その変数はに設定されます。file file

一致する行も出力するには:

awk -v file="$foo" '$0 == "file " file { output = 1 }; output' files.txt

おすすめ記事