怠惰な方法

怠惰な方法

以前にインスタンスがない場合は、abcすべてのインスタンスを置き換えたいと思います。123https://

パスワード:

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

あなたが探しているもの否定的に後ろを振り返って、サポートされていないsedawkサポートされていません。たとえば、次のことをお勧めします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もっと長くても読みやすいかもしれません)。
  • 他の変数には表示されませんorignewまたはInitialFinal
  • 以前と同様に、sed式を破る文字は含まれていません。

関連情報