【问题标题】:unable to search in file1 and replace in file2 using sed and xargs for all lines无法在 file1 中搜索并在 file2 中使用 sed 和 xargs 替换所有行
【发布时间】:2020-05-06 22:01:12
【问题描述】:

我需要搜索file1中的每个字符串,然后用字符串替换file2中的那个字符串

文件1

node1
node2

文件2

node1
node2
node3
node4
cat ~/backup/file1.log | xargs -l1 -- sh -c 'sed -i "s/$1/done/g" ~/backup/file2.log' -- > ~/backup/file3.log

预期输出 文件3

done
done
node3
node4

实际输出

prints nothing in file3

【问题讨论】:

  • 不鼓励 xargs+sh+sed 解决方案(并且不确定它是否会工作),但使用 -i 选项会将任何更改写回 ~/backup/file2.log ,因此 file3 将为空..检查file2 内容
  • 你说得对,我剥离了 i 并定向到文件,然后它被保存了。你能发布这个答案,我会标记它。因为下面的答案可能也很好,但我需要理解然后标记它。

标签: awk sed xargs


【解决方案1】:

既然可以在 awk 中完成所有操作,为什么还要使用复杂的 sed/xargs 循环?最糟糕的是,您的命令会为第一个文件中的每个新条目执行新的文件 I/O。

awk 'FNR == NR { lines[$1]; next } $1 in lines { $0 = "done" }1' f1 f2 > f3

awk 命令的工作原理是将第一个文件中的所有行标记为 lines 数组,然后在查找第二个文件时,$1 in lines 将匹配第二个文件中行内容在 @ 中散列的那些行987654329@ 数组。如果是这样,请将当前行修改为 "done" 并打印 {..}1 或默认打印不匹配行的行。

$1 in line 可以替换为$0 in line,只要您通过“整个”行匹配两个文件中的内容。对于特定的列位置匹配,请拼出实际列。

【讨论】:

  • 你能解释一下你的表达吗?我是新人。
  • 你是什么意思@AhmFM:我已经在下面解释过了。你不明白哪一部分?
  • 好的:让我读一读……我在寻找 FNR、}1 和 []
  • @AhmFM:我试图在我的另一个答案中详细解释。看看你能不能看懂-stackoverflow.com/a/45452657/5291015
猜你喜欢
  • 2016-02-20
  • 2017-09-07
  • 2020-11-22
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2014-09-13
  • 1970-01-01
相关资源
最近更新 更多