2012-11-20 194 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 
相关问题