以前にインスタンスがない場合は、abc
すべてのインスタンスを置き換えたいと思います。123
https://
パスワード:
file=Data.txt
Initial="# Start";
orig="abc";
new="123";
Final="$" # Line Number
sed -r -e "/${Initial}/,${Final}s/${orig}/${new}/g" ${file} # Final doesn't accept $
データ:
# Start
abc.md
https://abc.md
The path is https://abc.md for abc.md
The path for abc.md is https://abc.md
予想出力:
# Start
123.md
https://abc.md
The path is https://abc.md for 123.md
The path for 123.md is https://abc.md
この目標をどのように達成できますか?
注:また、2つの間にパターンがある可能性があることを示すために${Initial}
andを使用する必要があります。${Final}
この回答この事件には該当しないThe path is: https://abc.md abc.md
答え1
あなたが探しているもの否定的に後ろを振り返って、サポートされていないsed
、awk
サポートされていません。たとえば、次のことをお勧めしますperl
。
file=Data.txt
export Initial="# Start"
export orig="abc"
export new="123"
export Final="5"
perl -pe '
$flag=1 if /$ENV{Initial}/;
s,(?<!https://)$ENV{orig},$ENV{new},g if $flag;
$flag=0 if $. == $ENV{Final};
' $file
答え2
https://
他のもの(含まれていない)で始まるすべてのインスタンスを一時的に変更し、abc
完了したらもう一度変更できます。
怠惰な方法
sed -e 's_https://abc_protected_g;/# Start/,$s_abc_123_g;s_protected_https://abc_'
入力には表示されないと確信できる一時文字列のいくつかの値を選択する必要があります(そして、シェルが妨げたりsed
引用した特殊文字を含まない)。試してみましたが、protected
もう少しユニークなものをお勧めします。
徹底したアプローチ
一時的な文字列が入力に表示されないかどうかわからない場合は、より長いが安全な選択肢は次のようにすることです。二つ文字列を置き換える:
sed -e 's/X/Xv/g;s_https://abc_Xu_g;/^# Start/,$s/abc/123/g;s_Xu_https://abc_g;s/Xv/X/g'
これら2つの一時的な文字列の要件は次のとおりです。
- 共通のプレフィックスがあります(私が使っていましたが、
X
もっと長くても読みやすいかもしれません)。 - 他の変数には表示されません
orig
:new
またはInitial
Final
- 以前と同様に、
sed
式を破る文字は含まれていません。