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

时间:2018-07-07 23:50:44

标签: file variables text sed replace

sed -e "s/Var4/r {replace.txt} /g" "input.txt" > "output.txt"

Var4:
占位符将被替换

replace.txt
包含可变数据

input.txt:
输入文件

output.txt
输出文件

在“ input.txt”中出现的每个“ Var4”都应替换为“ replace.txt”中的变量行,但sed会将“ replace.txt”读取为普通文本,而不是文件名:

不正确:     TextBox1.Value =“ r replace.txt”

正确:     TextBox1.Value =“ 0000AAAA”

我厌倦了在所有类似的帖子中搜索正确的语法,但是没有用!!

谢谢

Input.txt

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

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

Output.txt应该如下所示:

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

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

Replace.txt

0000AAAA
0000BBBB
0000CCCC

我也尝试过

sed -e "s/Var4/$(<replace.txt sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' | tr -d '\n')/g" "input.txt" > "output.txt"

但是输出仍然不正确:

TextBox1.Value = "0000AAAA
0000BBBB
0000CCCC
"
Else
TextBox1.Value = "- - - - - - -"
End If

TextBox1.Value = "0000AAAA
0000BBBB
0000CCCC
"
Else
TextBox1.Value = "- - - - - - -"
End If

更新1:

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

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

这可能对您有用(GNU sed):

true

在占位符之后附加替换行,然后在单独的sed调用中,在占位符之后附加该行,并使用替换命令来实现所需的结果。

sed '/Var4/R replaceFile' file | sed '/Var4/{N;s/"Var4"\(.*\)\n\(.*\)/"\2"\1/}' 命令一次只能读取一行文件,而R命令每次都读取整个文件。

答案 1 :(得分:0)

sed的{​​{1}}命令只能将文件内容输出到stdout。您无法在模式空间中获得该内容,也无法将该内容注入另一个r命令(如您的问题中的命令)。

只需使用shell即可实现。这是一个使用Bourne shell的解决方案,因为我不了解Windows:

sed

在这里,我假设sed -e "s/Var4/$(cat replace.txt)/g" "input.txt" > "output.txt" 的内容与您的示例(0000AAAA)类似,并且不包含任何“ /”,否则请在replace.txt命令中选择除“ /”之外的其他分隔符。

答案 2 :(得分:0)

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

感谢https://stackoverflow.com/users/967492/potong>可以在GNU bash上使用!