SED用文件II中的可变行替换每个占位符

时间:2018-07-08 20:48:15

标签: file variables text sed replace

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

如果“ Var4”位于该行的末尾,则效果很好,但是,如果后面有任何文本,则输出不正确?

Input.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

Replace.txt

0000AAAA
0000BBBB
0000CCCC

使用后的Output.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

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

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

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

  

“ r” [或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的GNU扩展,在sed的其他版本中将不起作用。上面的sed脚本可以与awk的任何版本一起使用。