Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 正确的sed就地字符串替换语法是什么?_Shell_Sed - Fatal编程技术网

Shell 正确的sed就地字符串替换语法是什么?

Shell 正确的sed就地字符串替换语法是什么?,shell,sed,Shell,Sed,我正在尝试替换文件中的一行,下面是我当前的shell脚本: sed -i "s%$line%$line_formatted%g" $file_source 每当我尝试将$line替换为$line\u格式时,都会出现以下错误: sed: -e expression #1, char 81: unknown option to `s' 我只是想知道正确的语法是什么 尝试一下下面的注释,它仍然不能替换文本。以下是我使用的代码: echo "Here is line: "$line echo "He

我正在尝试替换文件中的一行,下面是我当前的shell脚本:

sed -i "s%$line%$line_formatted%g" $file_source
每当我尝试将$line替换为$line\u格式时,都会出现以下错误:

sed: -e expression #1, char 81: unknown option to `s'
我只是想知道正确的语法是什么

尝试一下下面的注释,它仍然不能替换文本。以下是我使用的代码:

echo "Here is line: "$line
echo "Here is line_formatted: "$line_formatted

# sed -i "s%$line%$line_formatted%g" $topicJRXML_file_source

awk -v old="$line" -v new="$line_formatted" '
s=index($0,old) { $0 = substr($0,1,s-1) new substr($0,s+length(old)) }
' $topicJRXML_file_source

cp "$topicJRXML_file_source" "$topicJRXML_file_destination"
echo "Here is line after awk: "$line
这是我的控制台输出:

Here is line:  <property name="adhoc.display" value="Awk Test"/>
Here is line_formatted:  <property name="adhoc.display" value="$R{CUSTOM.Awk_Test.LABEL}"/>
Here is line after awk:  <property name="adhoc.display" value="Awk Test"/>
请参阅,了解使用sed强大地完成您想要的任务的可怕任务,但不要试图强迫sed在不支持文字字符串时假装它在操作文字字符串,只需使用awk即可:

awk -v old="$line" -v new="$line_formatted" '
    s=index($0,old) { $0 = substr($0,1,s-1) new substr($0,s+length(old)) }
    { print }
' file

给定保存在文件update-adhoc-display.XSLT中的以下XSLT模板:

…将转换以下内容的输入文档:

<root>
  <property name="adhoc.display" value="Initial Value 1"/>
  <property name="other.content" value="Initial Value 2"/>
</root>
<root>
  <property name="adhoc.display" value="Updated Value"/>
  <property name="other.content" value="Initial Value 2"/>
</root>
…到以下内容的输出文档:

<root>
  <property name="adhoc.display" value="Initial Value 1"/>
  <property name="other.content" value="Initial Value 2"/>
</root>
<root>
  <property name="adhoc.display" value="Updated Value"/>
  <property name="other.content" value="Initial Value 2"/>
</root>

深受,和-作为已知重复的答案-被标记为社区Wiki。

我打赌$line或$line\u格式包含%符号。您可能正在运行旧版本的sed,或者$line或$line\u格式包含%字符。将这两个变量的内容添加到您的问题中。@Cyrus Here is$line:Here is$line\u格式:不要使用sed修改xml。那太脆弱了。改用xml解析器/编写器。例如,您可以尝试XMLSTARTET。我尝试使用此awk替换而不是sed,但仍然无法获得所需的输出。正如您在上面看到的,变量$line实际上从未被$line\u替换。我遗漏了什么吗?是的,在处理文字字符串方面,awk是比sed更好的选择——但它们都是错误的XML工具。@JasonSmith就像sed一样,awk将输出打印到标准输出,而不是原始文件。就像GNU sed使用-i替代它的输出覆盖原始函数一样,GNU awk也使用-i替代它。使用任何工具,您都可以改为执行工具“脚本”文件>tmp&&mv tmp文件,以使用工具输出更新原始文件。在您的问题中,当您有echo时,这里是一行接一行的awk:$line您只是再次回显您在脚本开头设置的line值,它与awk输出无关。@charlesduff问题中出现的明显XML是在我发布此答案后添加的。我们仍然不知道OP是否在XML上运行,但我同意他的文件名和他与我们共享的文本现在看起来确实可疑!这实际上是一个XML文档@CharlesDuffy因为我在jenkins linux机器上运行这些脚本,所以我必须得到devops的批准才能安装xmlstarlet。现在,我正在尝试在没有xmlstarlet的情况下实现尽可能健壮的文本替换操作,但是如果有一种awk/sed/perl替换策略,那么在我当前的场景中,它将是最受欢迎的。