如何用其他文件的值替换特定模式?

时间:2014-06-11 07:07:27

标签: regex shell unix sed

我有一个示例文件,其内容如下所示。我想用不同文件中的值替换每行的值CP [0-9] *。原始文件在每行中的值之后也有一些空间,我也需要保留它们。

原始文件样本;

05CP14159170891652517

05CP14159170891652522

05CP14159170891652515

05CP14159212891662119

05CP14160021691687657

05CP14159064591626228

05CP14159064591626229

文件用于替换的文件:

DBB126EEEE
DBB131EEEE
DBB140EEEE
DBB145EEEE
DBB146EEEE
DBB147EEEE
DBB159EEEE
DBB171EEEE

我想用DBB126EEEE代替例如05CP14159170891652517和用DBB131EEEE代替05CP14159170891652522等等。

请建议我如何做到。

2 个答案:

答案 0 :(得分:0)

IIUC没有简单的方法可以使用sed执行此操作,另一方面awk可以相当直接地执行此操作:

awk 'FNR==NR { repl[FNR] = $0; next } NF { sub("05.*", "05" repl[++i]) } 1' replfile origfile

输出:

05DBB126EEEE

05DBB131EEEE

05DBB140EEEE

05DBB145EEEE

05DBB146EEEE

05DBB147EEEE

05DBB159EEEE

该脚本将替换字符串加载到repl数组中,然后使用该数组替换sub()

答案 1 :(得分:0)

我能够通过以下命令获得输出

awk 'FNR==NR { repl[FNR] = $0; next } { sub("05.*", "05" repl[++i]) } 1' replfile origfile

@Thor:在循环之间使用NF会有什么用?

我无法评论,因为我有50多个声誉。