【问题标题】:Unknown command `>' with sed带有 sed 的未知命令 `>'
【发布时间】:2015-09-14 23:35:10
【问题描述】:

我一直在尝试通过 sed 命令但没有成功。

这是我尝试使用的 sed 命令;

sed -i "/<\/Testing>/i '<Tester>$VAR</Tester>'" filename

我不断收到a unknown command: &lt;...我知道为什么,但没有运气。单引号没问题,但不显示 $VAR 值,只显示文字字符串。

对于不太熟悉sed 的读者,这是一个正则表达式后跟一个i 命令,而不是"s%&lt;Testing&gt;%$VAR%" 替换的草率错误输入。 i 命令在匹配行之前插入一个字符串。换句话说,当输入匹配&lt;/Testing&gt;时,我想在匹配行之前添加一个描述测试用例的sn-p。

【问题讨论】:

  • edit您的问题显示您的输入样本和所需的输出。您是否尝试执行替换?
  • 您似乎没有提供足够的信息。我可以用VAR=$'&lt;hello&gt;\n&lt;/hello&gt;'; sed "/&lt;\/Testing&gt;/i '&lt;Tester&gt;$VAR&lt;/Tester&gt;'" &lt;&lt;&lt;$'&lt;Testing&gt;\nmoo&lt;/Testing&gt;\n&lt;end&gt;\npoo\n&lt;/end&gt;' 重现您所描述的内容,但是对于您可能涉及的内容有大量的猜测。

标签: bash sed


【解决方案1】:

如果$VAR 包含换行符,则需要反斜杠转义它。

vnix$ VAR=$'<hello>\n</hello>'

vnix$ sed "/<\/Testing>/i '<Tester>$VAR</Tester>'" <<<$'<Testing>\nmoo</Testing>\n(end)'
sed: -e expression #1, char 33: unknown command: `<'

vnix$ VAR=$'<hello>\\\n</hello>'

vnix$  sed "/<\/Testing>/i '<Tester>$VAR</Tester>'" <<<$'<Testing>\nmoo</Testing>\n(end)'
<Testing>
'<Tester><hello>
</hello></Tester>'
moo</Testing>
(end)

(我也猜想您实际上并不想要替换值周围的单引号,但这显然很容易解决。)

【讨论】:

  • 不错的侦探工作 :) 我猜你隐含地假设了一个 sed 版本,它理解指定要插入到与 i 相同的行上的字符串(标准说使用 i\ 并将其放在下一行)。
  • 如果您需要以编程方式进行替换,可以使用nl=$'\n'; VAR="${VAR//$nl/\\n}"
【解决方案2】:

您需要指定某些命令,例如“s”(开头):

sed -i "s/</Testing>/i '$VAR'" filename

另外,如果您显示示例输入和输出会更好

【讨论】:

  • 我不认为他试图进行任何替换,但在&lt;/Testing&gt; 之后添加一行。
  • 命令 (i) 紧跟在它所属的地址 (/&lt;\/Testing&gt;/) 之后。
猜你喜欢
  • 2023-03-30
  • 2013-07-08
  • 2016-03-10
  • 1970-01-01
  • 2015-10-14
  • 2020-05-04
  • 2020-05-21
  • 2015-01-26
相关资源
最近更新 更多