需要用file1中的字符串替换file2中的字符

时间:2013-01-22 23:08:34

标签: shell sed awk

这是我想要做的。

File1中:

abc
bcd
cde
def
efg
fgh
ghi

文件2:

ip:/vol0/scratch/&
ip:/vol0/sysbuild/
ip:/vol0/cde
ip:/vol0/mnt/cm/&
ip:/vol0/&
ip:/vol0/mnt/fgh
ip:/vol0/mnt/&

正如您可以看到File2在某些行的末尾有&,我需要将&替换为File1中的相应行,并忽略没有&例如,如果第2行和第3行没有&,则脚本会跳过两个文件中的第2行和第3行,并转到第4行以替换&

如何使用shell脚本实现此目的。

5 个答案:

答案 0 :(得分:0)

使用pasteawk

$ paste file2 file1 | awk 'sub(/&\s+/,"")'
ip:/vol0/scratch/abc
ip:/vol0/mnt/cm/def
ip:/vol0/efg
ip:/vol0/mnt/ghi

如果您希望输出中的行不以&结尾,则不是100%清除:

$ paste file2 file1 | awk '{sub(/&\s+/,"");print $1}'
ip:/vol0/scratch/abc
ip:/vol0/sysbuild/
ip:/vol0/cde
ip:/vol0/mnt/cm/def
ip:/vol0/efg
ip:/vol0/mnt/fgh
ip:/vol0/mnt/ghi

使用sed

$ paste file2 file1 | sed -rn '/&/s/&\s+//p'
ip:/vol0/scratch/abc
ip:/vol0/mnt/cm/def
ip:/vol0/efg
ip:/vol0/mnt/ghi

答案 1 :(得分:0)

awk 'NR==FNR{a[NR]=$0;next} sub(/&/,a[FNR])' file1 file2

答案 2 :(得分:0)

paste file1 file2 | awk 'gsub( /&/, $1 )' | cut -f2-

答案 3 :(得分:0)

试试这个

awk '{if (NR == FNR){f[NR]= $0;}else {gsub("&",f[FNR],$0); print $0}}' file1.txt file2.txt

答案 4 :(得分:0)

这可能适合你(GNU sed):

sed = file1 | sed -r 'N;s/(.*)\n(.*)/\1s|\&$|\2|/' | sed -f - file2
  1. sed = file1生成行号
  2. sed -r 'N;s/(.*)\n(.*)/\1s|\&$|\2|/'将行号与数据行合并,并使用行号作为地址生成sed替换命令。
  3. sed -f - file2使用-f开关和标准输入-
  4. 将上述命令提供给sed调用