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