ファイルから代替をロードする sed [重複]

ファイルから代替をロードする sed [重複]

sedを使用して、あるファイルのパターンを別のファイルの内容全体に置き換えようとします。

現在私は以下を使用しています:

sed "s/PATTERN/`cat replacement.txt`/g" "openfile.txt" > "output.txt"

'ただし、代替ファイルに、"または同じ文字が含まれていると/入力が削除されず、エラーが発生し始めます。

試してみました。このガイド助けようとするのに理解しにくいですね。提案されたコマンドを試すと、文字列のみがr file表示されます。

この問題を解決するための最良の方法は何ですか?

答え1

これあなたのために働く必要があります。ファイル'におよび文字があることをすでに指定しているため、重複して終了するように投票していません/"だから、次のテストをしてみました。

私はfile1以下を持っています。

cat file1
ramesh' has " and /
in this file
and trying
"to replace'
the contents in 
/other file.

これで、file2次のようになります。

cat file2
This is file2
PATTERN 
After pattern contents go here. 

共有リンクに基づいて、次のように作成しましたscript.sed

cat script.sed
/PATTERN/ {
  r file1
  d
}

sed -f script.sed file2今私が得る出力でコマンドを実行すると、次のようになります。

This is file2
ramesh' has " and /
in this file
and trying
"to replace'
the contents in 
/other file.
After pattern contents go here. 

編集する:これはファイルの複数のパターンにも当てはまります。

答え2

ソリューションが必要な場合は、awk以下に示すソリューションを使用できます。

 awk '/PATTERN/{system("cat file1");next}1' file2

テスト

cat file1
ramesh' has " and /
in this file
and trying
"to replace'
the contents in 
/other file.

file2これで、次のものがあります。

cat file2
This is file2
PATTERN 
After pattern contents go here.
PATTERN 

ここで上記のawkコマンドを使用します。

出力:

This is file2
ramesh' has " and /
in this file
and trying
"to replace'
the contents in 
/other file.
After pattern contents go here.
ramesh' has " and /
in this file
and trying
"to replace'
the contents in 
/other file.

引用する

http://www.unix.com/shell-programming-and-scripting/158315-replace-string-contents-txt-file-changing-multiple-lines-strings.html

答え3

存在する:

sed "s/PATTERN/`cat replacement.txt`/g" "openfile.txt"

'"問題ではありません。これらは特別なものではありませんsed。問題は、&改行文字です。他のコマンドを使用してエスケープできます。\/sed

sed "s/PATTERN/$(sed 's@[/\&]@\\&@g;$!s/$/\\/' replacement.txt)/g" openfile.txt

から末尾の改行を削除しますreplacement.txt。これがあなたが望むものではない場合、これを行うことができます

replacement=$(sed 's@[/\&]@\\&@g;s/$/\\/' replacement.txt; echo .)
replacement=${replacement%.}
sed "s/PATTERN/$replacement/g" openfile.txt

答え4

GNUを使用すると、sedスクリプトのどこからでも好きなように何でもできますecat対照的rに - ラインサイクルの終わりに出力をスケジュールします。(これはとても残念です!)はまたはe同様に機能し、出力をすぐに記録します。以下は、その使用のいくつかの例です。ic

printf %s\\n 'these are some words' \
    'that will each appear' \
    'on their own line' | 
    sed 's/.*words/echo & ; cat file/e'
these are some words
these
are
some
more
words    
that
are
stored
in
a
file
that will each appear
on their own line

使用方法は次のとおりです。

printf %s\\n 'these are some words' \
    'that will each appear' \
    'on their own line' | 
sed 's/\(.*\)\n*words/\1\n&/;//P;s//\ncat file/ep;s/.*\n//'
these are some 
these
are
some
more
words
that
are
stored
in
a
file
that will each appear
on their own line

関連情報