2012-11-20 178 views
2

的內容我有兩個文件:替換字符串第二個文件

  • fileA

    date >> /root/kvno.out 
    kvno serverXXX\$ >> /root/kvno.out 
    
  • fileB

    foobar 
    

我需要創建一個新文件, fileC,與相同內容fileA,除了與字符串XXX被替換的fileB內容:

date >> /root/kvno.out 
kvno serverfoobar\$ >> /root/kvno.out 

我想做到這一點使用sed

我嘗試了一些我發現的例子,但我只能得到fileB的內容fileC

回答

2

這可能爲你工作(GNU SED):

sed '1{h;d};/XXX/{G;s/XXX\(.*\)\n\(.*\)/\2\1/}' fileB fileA >fileC 

編輯:

備選地:

sed 's|XXX|'$(tr -d '\n' <fileB)'|' fileA >fileC 
+0

只有當fileB嚴格限定爲1行時,這纔會起作用。 – anishsane

+0

@anishsane參見編輯 – potong

+0

不幸的是,如果fileB包含'|',這個'EDIT'將會中斷。 – anishsane

1

有一些含糊不清你的問題,但這個作品,如果我理解正確的您的要求:

#!/bin/bash 

string=$(cat fileB) 
sed "s/XXX/$string/g" <fileA> fileC 

警告:fileB不能包含/

說明:

  • string=$(cat fileB):保存c一個叫string
  • sed "s/XXX/$string/g": use變量fileB ontents sed的to replace all occurrences of XXX with what is inside the variable $字符串. (The g`一部分,是指代替-ALL)
  • < fileA:輸入重定向 - 使用fileA作爲輸入
  • > fileC:輸出重定向 - 輸出到fileC
+0

它也將去除fileB中的任何前導或尾隨空白。 –

2
while IFS= read -r line; do 
    echo "${line/XXX/$(< fileB)}" 
done <fileA> fileC 
+1

+1,但這是'-r'和'IFS ='的呼喊。 :-P – ruakh

+0

@ruakh - +1:是的,它會失敗,發佈的輸入不帶-r,並且在沒有IFS =的情況下輸入其他輸入時會失敗。 –

0

sed的是用於在一個單一的線路簡單取代的優秀工具。對於其他任何東西,只需使用awk:

awk 'NR==FNR{b=b s $0; s=ORS; next} {sub(/XXX/,b)} 1' fileB fileA 
相關問題