2016-11-22 8 views
0

印刷可能な文字を含むことができる複雑な文字列を置き換える必要があります。これは私がsedを使用して置き換えることができなかった実際のパターンの例です。Sed/Awkは、印刷可能な文字を含む複雑な文字列を置き換えます。

<!-- %cmd: for F in $(find ../[09]* -maxdepth 1 -type d -printf "%P\n") | grep -v "^$"; do echo "<li><a href=\"$F\">$F</a></li>"; done --> 

元の文字列が印刷可能な文字のみで構成されなければならないので、私も競合を避けるために、非印刷可能なSED区切り文字を使用しています:

DELIM=$(echo -en "\001"); 

しかし、それは動作しません。私は多くのことを試しましたが、私は何が欠けているのか分かりません。例えば:

echo "BEFORE $PATTERN AFTER" | sed -e "s${DELIM}${PATTERN}${DELIM}NEWTEXT${DELIM}" 

UPDATE-1:

新しいものと一致する文字列を交換しながら提供される解決策は、コンテナのテキストのすべての行を印刷しなければなりません。

pattern='<!-- %cmd: for F in $(find ../[0-9]* -maxdepth 0 -type d | sed "s/^\.\.\///"); do echo "<li><a href=\"$F\">$F</a></li>"; done -->' 
container=' 
<h2>Title</h2> 
<ul> 
    <!-- %cmd: for F in $(find ../[0-9]* -maxdepth 0 -type d | sed "s/^\.\.\///"); do echo "<li><a href=\"$F\">$F</a></li>"; done --> 
</ul> 
' 

UPDATE-2:

awk -v repl="newtext" 'FNR==NR { 
    a = a $0; next 
} n = index($0, a) { 
    $0 = substr($0, 1, n-1) repl substr($0, n+length(a)) 
} 1' < (printf '%s\n' "$pattern") <(printf '%s' "$container") 

Code demo

反復のカップルの後、これは@anubhavaによって構築作業、最終的な受け入れ答えです

+0

[編集ヘルプ](http://stackoverflow.com/editing-help)をご覧ください。ラインに4つの空白を付ける。 – Cyrus

答えて

2

あなたはこのようなものだsedの区切りにconrol文字を使用することができます。

pattern='foobar' 
delim=$'\01' 
echo "before $pattern after" | sed "s${delim}${pattern}${delim}newtext${delim}" 

before newtext after 

更新:

あなたのパターンが特殊なメタ文字のすべての種類が含まれているとして、それは正規表現を捨てる方が良いです(SED)そして、awkを使用して、非正規表現の置換を使用します。

pattern='<!-- %cmd: for F in $(find ../[09]* -maxdepth 1 -type d -printf "%P\n") | grep -v "^$"; do echo "<li><a href=\"$F\">$F</a></li>"; done -->' 

awk -v repl="newtext" 'FNR==NR { 
    a = a $0; next 
} 
n = index($0, a) { 
    $0 = substr($0, 1, n-1) repl substr($0, n+length(a)) 
} 1' <(printf "%s\n" "$pattern") <(echo "before $pattern after") 

before newtext after 

Code Demo

+0

ありがとうございますが、 'foobar'を私が質問で示したパターンで置き換えると、Bash 4.3シェルを使用しても動作しません。 –

+0

[上のコードのデモがここにあります](http://ideone.com/pnG2or) – anubhava

+1

@joseLuís:GNU bashバージョン4.2.8でうまく動作します。 – Cyrus

関連する問題