在linux中使用sed或awk替换具有双斜杠的字符串

时间:2015-07-22 12:20:00

标签: linux string shell awk sed

我想替换这个

<property name="sourceUrl" value="file://D:/Uploaded Files?move=../../backup&amp;include=.*.ok"/>

用这个

<property name="sourceUrl" value="file:///tmp/ETL-Files?move=../../backup&amp;include=.*.ok"/>

我正在按照一种方法首先找到行号,然后用所需的文本替换该行,但由于行的开头存在<,因此不会发生这种情况。

 grep -n  ^<property name="sourceUrl" value= etl-job-context.xml

我该如何解决这个问题,还是有更好的方法?

1 个答案:

答案 0 :(得分:1)

您可以使用sed。

sed 's~\(<property *name="sourceUrl" *value="\)[^?]*~\1file:///tmp/ETL-Files~g' file

Basic sed使用Basic Regular Expression引擎进行匹配。在BRE \(..\)被称为捕获组。因此,这将捕获从属性标记到value参数的所有字符。最后?的剩余字符与[^?]*匹配,这意味着匹配除?之外的所有字符,零次或多次。

Sed使用一些特殊的字符作为分隔符。这里我使用了~,因为替换字符串包含/斜杠。替换中的\1指的是由组索引1捕获的字符。以下字符将在捕获的字符旁边加上。请注意,匹配的字符会在替换期间自动删除。