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
有什么建议吗?
答案 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
的任何版本一起使用。