0

如何将包含制表符 (\t) 的行的一部分替换为 sed、awk 或任何其他?

线

    <property name="systemVersionDsvTes"                value="xxx"/>

或者

\t<property name=\"systemVersionDsvTes\"\t\t\t\tvalue=\"xxx\"/>

应改为:

    <property name="systemVersionDsvTes"                value="yyy"/>

或者

\t<property name=\"systemVersionDsvTes\"\t\t\t\tvalue=\"yyy\"/>

xxx值可以变化,属性名称前有一个制表符,值前有四个制表符。此名称-值对是 xml 文件中唯一的一对。

我尝试了以下方法:

ACTUAL_VERSION="\t<property name=\"systemVersionDsvTes\"\t\t\t\tvalue=\"4.1.9\"/>"
NEW_VERSION="\t<property name=\"systemVersionDsvTes\"\t\t\t\tvalue=\"4.1.10\"/>"
sed -i -e "s/$ACTUAL_VERSION/$NEW_VERSION/g" buildSIM.xml

这导致了一个错误: sed: -e expression #1, character 65: Unknow option for command `s' (s///?)

表达有什么问题?使用 GNU sed。

4

2 回答 2

1

错误消息Unknow option for command 's' (s///?)是指可以在第三个斜杠之后添加到替换命令的“选项”。这些选项包括g替换所有出现的模式而不只是第一个出现的字母,或i忽略字母大小写。它通常暗示模式或替换包含额外的斜线。要处理模式中的斜线或替换,它们也必须被转义:

ACTUAL_VERSION="\t<property name=\"systemVersionDsvTes\"\t\t\t\tvalue=\"4.1.9\"\/>"
NEW_VERSION="\t<property name=\"systemVersionDsvTes\"\t\t\t\tvalue=\"4.1.10\"\/>"

或者,您可以使用不同的字符而不是斜杠作为分隔符,例如#

sed -i -e "s#$ACTUAL_VERSION#$NEW_VERSION#g" buildSIM.xml
于 2013-07-09T13:44:29.057 回答
1

好悲哀,只需使用 awk 并且不要担心所有这些 sed 废话:

$ cat file
        <property name="systemVersionDsvTes"                            value="4.1.9"/>

$ ACTUAL_VERSION='\t<property name="systemVersionDsvTes"\t\t\t\tvalue="4.1.9"/>'

$ NEW_VERSION='\t<property name="systemVersionDsvTes"\t\t\t\tvalue="4.1.10"/>'  

$ awk -v act="$ACTUAL_VERSION" -v new="$NEW_VERSION" '{gsub(act,new)}1' file   
        <property name="systemVersionDsvTes"                            value="4.1.10"/>

实际上,您可能希望使用您采用的任何方法来转义 ACTUAL_VERSION 值中的“.”,因为它们匹配任何字符而不是文字“.”。或者,在 awk 中,您可以更改为使用字符串比较而不是 RE 比较:

$ awk -v act="$ACTUAL_VERSION" -v new="$NEW_VERSION" 'start=index($0,act) { $0=substr($0,1,start-1) new substr($0,start+length(act)) }1' file   
        <property name="systemVersionDsvTes"                            value="4.1.10"/>

没有与 sed 中的等效项。

于 2013-07-09T18:04:23.370 回答