【问题标题】:SED replace each placeholder with variable lines in fileSED 用文件中的可变行替换每个占位符
【发布时间】:2018-12-16 02:08:52
【问题描述】:
sed -e "s/Var4/r {replace.txt} /g" "input.txt" > "output.txt"

Var4:
占位符被替换

替换.txt
包含可变数据

input.txt:
输入文件

输出.txt
输出文件

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

不正确: TextBox1.Value = "r 替换.txt"

正确: TextBox1.Value = "0000AAAA"

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

谢谢

输入.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

替换.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" 位于行尾,则可以完美运行,但是如果在其后存在任何文本,则输出不正确?

输入.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

有什么建议吗?

【问题讨论】:

  • Windows 本身不包含sed,除了 Windows 10 中的 WSL 选项,因此您必须从其他来源获得它;大多数此类来源还提供或提供awk 和/或perl,其中任何一个都更适合此问题。
  • 我在 windows 上安装了 bash 以保持一致性,它可以工作,只是获得正确的语法以获得正确的结果。

标签: file variables text sed replace


【解决方案1】:

sedr命令只能将文件内容输出到stdout。您无法在模式空间中获取该内容,也无法将该内容注入另一个 sed 命令(就像您问题中的那个)。

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

sed -e "s/Var4/$(cat replace.txt)/g" "input.txt" > "output.txt"

这里我假设replace.txt 的内容与您的示例(0000AAAA)相似并且不包含任何“/”,否则请在您的s/// 命令中选择除“/”之外的其他分隔符。

【讨论】:

  • 1. windows下 cmd > 输出仍然不正确 TextBox1.Value = "r replace.txt" 2. bash下 > error > unterminated 's' command
  • 1.毫不奇怪,我没有为您的 Windows 命令提供任何增强功能。 2. 您的文件replace.txt 可能包含不止一行。它应该包含一行 0000AAAA (或任何其他数据,只要里面没有“/”)。如果你想在 output.txt 中插入跳行,用\n 分隔行,像这样:0000AAAA\n0000BBBB\n0000CCCC
  • 如果你想把replace.txt的全部内容插入到Var4标记的地方,看我之前的评论。如果您想在这 3000 行中插入一个精确的行,那么我不明白您的问题:在您的问题中解释应该如何选择该行,并给出一个精心挑选的 replace.txt 和 @987654333 的小样本@.
  • 我在 windows 上安装了 bash 以保持一致性,它可以工作,只是获得正确的语法以获得正确的结果。请参阅我发布的示例。
【解决方案2】:

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

sed '/Var4/R replaceFile' file | sed '/Var4/{N;s/"Var4"\(.*\)\n\(.*\)/"\2"\1/}'

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

注意R 命令一次只读取以下文件一行,而r 命令每次调用时都会读取整个文件。

【讨论】:

  • 干得好!我只是更改了输入和输出文件名以匹配原始帖子。
  • sed '/Var4/R replace.txt' input.txt | sed '/Var4/{N;s/"Var4"\n(.*)/"\1"/}' > "output.txt" 有效但是,"Var4" 必须在行尾!如果后面有文字怎么办?
  • @potong Perfect :-)
【解决方案3】:
sed '/Var4/R replace.txt' input.txt | sed '/Var4/{N;s/"Var4"\n\(.*\)/"\1"/}' > "output.txt"

感谢 https://stackoverflow.com/users/967492/potong > 这适用于 GNU bash!

【讨论】:

  • 如果你想感谢 potong,只需在他们的回答中添加评论,然后点击旁边的向上箭头。
猜你喜欢
  • 2018-12-16
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 2013-11-15
  • 1970-01-01
  • 2019-12-20
相关资源
最近更新 更多