sedを使用して文字列をファイルの内容に置き換えます


23

2つの異なるファイルがあります。

File1

/home/user1/  
/home/user2/bin  
/home/user1/a/b/c

File2

<TEXT1>
<TEXT2>

を使用して<TEXT1>File2File1のコンテンツに置き換えたいと思いますsed。このコマンドを試しましたが、適切な出力が得られませんでした。

cat File2|sed "s/<TEXT1>/$(cat File1|sed 's/\//\\\//g'|sed 's/$/\\n/g'|tr -d "\n")/g"

他のツールを使用してこの問題を解決することもできます。


そのエラーメッセージを貼り付けて、ソースを特定できるようにしてください。また、使用しているsed実装を教えてください。あなたのコードはGNUで私のために動作しますsed
マナトワーク

申し訳ありませんが、エラーは発生していません。希望する出力が得られません。出力は次のようになり/home/user1/ n/home/user2/bin n/home/user1/a/b/cn <TEXT2>ます。新しい行を取得していません。
chanchal1987

わからないこれはあなたの特定のケースに適用されますが、となる場合diffpatchツールは非常に簡単に他の行で、ファイル内のいくつかの行を交換することができます。
ステファンギメネス

1
ところで、$()sedスクリプトで収集されたランダムデータを使用すると、目が出血します。一部の文字が特別な意味で解釈される場所では、外部データを使用しないでください
ステファンギメネス

回答:


24

sedスクリプトソリューションを次に示します(コマンドラインで1行にしようとするよりも目で見て簡単です)。

/<TEXT1>/ {
  r File1
  d
}

実行する:

$ sed -f script.sed File2
/home/user1/
/home/user2/bin
/home/user1/a/b/c
<TEXT2>

これが機能していることに感謝します。しかし、他のスクリプトファイルは使用したくありません。インラインソリューションはありますか?
chanchal1987

確かsed '/<TEXT1>/{rFile1^Md^M}' File2に、「^ M」はリターンを押すことです。問題は、sedがrコマンドとdコマンドを区切るために{...}内の改行を本当に必要とすることです。
クサラナンダ

6
bashので、POSIXスタイルの文字列は、ビットクリーナーです:sed $'/<TEXT1>/ {r File1\n d}'
グレン・ジャックマン

9
また、1つのライナーの-eを使用すると:sed -e '/<TEXT1>/{r File1' -e 'd}' File2
sdaau

1
そして<TEXT1>、を含む行全体を置き換える代わりに、文字列自体を置き換えて、残りの行をそのまま残したい場合はどうでしょうか?Text1: <TEXT1>Text1: <file_contents>
ロビンウィンスロー

9

var replacementを使用してこのソリューションを見つけるのに長い時間がかかりました。すべてのsedソリューションは、完全な行を削除するか、誤って置換するため、機能しませんでした。

FILE2=$(<file2)
FILE1=$(<file1)
echo "${FILE2//TEXT1/$FILE1}" 

file2内のTEXT1のすべての出現をfile1のコンテンツに置き換えます。他のすべてのテキストは変更されません。


非常に素晴らしい。おそらく速くよりsedも、(代替別名)これらの「拡張は」(シェルに組み込まれているので、bash少なくとも)
まろやかな黄色

7

diff/ patchメソッドは場合によっては興味深いかもしれないので、私は答えます。ファイルblob1に含まれる行のblob2使用に含まれる行による置換を定義するには:

diff -u blob1 blob2 > patch-file

たとえば、次がblob1含まれている場合:

hello
you

そして、blob2含まれています。

be
welcome
here

生成patch-fileされるもの:

--- blob1   2011-09-08 16:42:24.000000000 +0200
+++ blob2   2011-09-08 16:50:48.000000000 +0200
@@ -1,2 +1,3 @@
-hello
-you
+be
+welcome
+here

これで、このパッチを他のファイルに適用できます。

patch somefile patch-file

それは置き換えられますhelloyouによってラインbewelcomehere内の行をsomefile


これは本当に賢いですが、スクリプトでそれを自動化することができれば良いだろう
qodeninja
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.