【问题标题】:SED replace each placeholder with variable lines in file IISED 用文件 II 中的变量行替换每个占位符
【发布时间】:2018-12-16 13:36:56
【问题描述】:
sed '/Var4/R replace.txt' input.txt | sed '/Var4/{N;s/"Var4"\n\(.*\)/"\1"/}' > "output.txt"

如果 "Var4" 位于行尾,则可以完美运行,但是如果在其后存在任何文本,则输出不正确?

输入.txt

TextBox1.Value = "Var4"  Then
Else
TextBox1.Value = "- - - - - - -"
End If

TextBox1.Value = "Var4"  Then
Else
TextBox1.Value = "- - - - - - -"
End If

Output.txt 应该如下所示:

TextBox1.Value = "0000AAAA"  Then
Else
TextBox1.Value = "- - - - - - -"
End If

TextBox1.Value = "0000BBBB"  Then
Else
TextBox1.Value = "- - - - - - -"
End If

替换.txt

0000AAAA
0000BBBB
0000CCCC

使用后的输出.txt:

sed '/Var4/R replace.txt' input.txt | sed '/Var4/{N;s/"Var4"\n\(.*\)/"\1"/}' > "output.txt"

TextBox1.Value = "Var4"  Then
0000AAAA
Else
TextBox1.Value = "- - - - - - -"
End If

TextBox1.Value = "Var4"  Then
0000BBBB
Else
TextBox1.Value = "- - - - - - -"
End If

有什么建议吗?

【问题讨论】:

  • 抱歉不工作 >>>>>> sed '/Var4.*/R replace.txt' input.txt | sed '/Var4/{N;s/"Var4"\n(.*)/"\1"/}' > "output.txt"

标签: file variables text sed replace


【解决方案1】:

这里不能使用 GNU sed/R 命令,因为没有机会使用 replace.txt 中的值进行处理。 /R 会立即将它们写入标准输出,而不是写入模式空间。这意味着任何 sed 命令都无法访问 replace.txt 的内容。

此处描述例如:http://www.grymoire.com/Unix/Sed.html#uh-37

“r” [或 R] 命令将文件写入输出流。该文件没有插入到模式空间中,因此不能被任何命令修改。


解决方案

我会使用awk。像这样:

awk 'NR==FNR{r[NR]=$0;next}/"Var4"/{sub(/Var4/,r[++i])}1' replace.txt input.txt

使用多行版本的解释:

# True as long as we are reading the first file (replace.txt)
NR==FNR{
    r[NR]=$0 # Store replacement in an array r
    next     # Don't enter the blocks below
}

# When "Var4" is found
/"Var4"/{
    # replace Var4 by next element of r
    sub(/Var4/,r[++i])
}

1 # Print the line

顺便说一句,即使它可以工作,/R 命令是sed 的 GNU 扩展,在sed 的其他版本中不起作用。上面的awk 脚本应该适用于任何版本的awk

【讨论】:

  • 完美!谢谢 - sed 和 awk 有什么区别?
  • 稍微调整一下,这也可以工作>>>>> sed '/Var4/R replace.txt' input.txt | sed '/Var4/{N;s/"Var4"(.*)\n(.*)/"\2"\1/}' > "output.txt"
  • 是的,应该可以,但是会在输入文件中处理两次,效率不高。
  • /"Var4"/{ sub(/Var4/,r[++i]) } 将与 OP 发布的示例输入数据一起使用,但不适用于其他数据(例如,如果 & 出现在 replace.txt 中,或者如果 Var4Var.4)。我个人会使用BEGIN{old="\"Var4\""; lgth=length(old)-2} ... s = index($0,"\"Var4\"") { $0 = substr($0,1,s) r[++i] substr($0,s+lgth) },所以比较和替换都是文字字符串操作,因此在任何输入的情况下都可以工作。
猜你喜欢
  • 2018-12-16
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 2012-05-11
  • 1970-01-01
  • 2019-03-24
相关资源
最近更新 更多