web-dev-qa-db-ja.com

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

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

ファイル1

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

ファイル2

<TEXT1>
<TEXT2>

File2<TEXT1>sedを使用してFile1の内容に置き換えたい。私はこのコマンドを試しましたが、適切な出力が得られませんでした:

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

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

23
chanchal1987

これがsedスクリプトソリューションです(コマンドラインで1行にまとめようとするよりも目には簡単です)。

/<TEXT1>/ {
  r File1
  d
}

それを実行する:

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

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

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

File2内のすべてのTEXT1の出現箇所をfile1の内容と置き換えます。他のすべてのテキストは変更されません。

9
marcas756

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に置き換えます。

7