【问题标题】:how to replace a particular pattern by the values of other file?如何用其他文件的值替换特定模式?
【发布时间】:2014-06-11 07:07:26
【问题描述】:

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

原始文件样本;

05CP14159170891652517

05CP14159170891652522

05CP14159170891652515

05CP14159212891662119

05CP14160021691687657

05CP14159064591626228

05CP14159064591626229

文件替换用哪个文件:

DBB126EEEE
DBB131EEEE
DBB140EEEE
DBB145EEEE
DBB146EEEE
DBB147EEEE
DBB159EEEE
DBB171EEEE

我想将 05CP14159170891652517 替换为 DBB126EEEE,将 05CP14159170891652522 替换为 DBB131EEEE 等等。

请建议我如何做到这一点。

【问题讨论】:

  • 你的意思是替换整行还是只在05之后?
  • 仅在 05 之后,末尾的空间应保留在新文件中。

标签: regex shell unix sed


【解决方案1】:

IIUC 没有简单的方法可以做到这一点,sedawk 可以相当直接地做到这一点:

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() 进行替换。

【讨论】:

  • 谢谢雷神,但使用这种方式我需要在其他新文件中写入值正确吗?而且我也无法保留我提到的空间,在每一行之后,我还需要在新文件中保留一些空间。
  • @GauravParek:除非您专门替换字节,否则您总是必须编写一个新文件,有些程序会在幕后为您执行此操作,例如sed -i,但是仍然写入了一个新文件。关于空间的保留,我认为您的意思是保留双行距。为了更清楚,您应该将所需的输出添加到问题中。
  • 如果造成混乱,我很抱歉。现在我想你已经理解了我的疑问,能否请你帮助我是否可以这样做。提前致谢
  • @GauravParek:我仍然看不到这个答案缺少什么。您能否edit your question 并准确包含您期望的输出。
【解决方案2】:

我能够使用以下命令获得输出

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

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

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

【讨论】:

  • 每个 awk 代码块都附有一个布尔表达式,用于确定是否应该执行它。在这种情况下,NF 确保 { sub("05.*", "05" repl[++i]) } 仅在该行包含任何字段时执行。现在想想,更正确的表达方式是/^05/
  • 感谢雷神的解释
猜你喜欢
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
  • 2013-11-06
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
相关资源
最近更新 更多