【问题标题】:Replacing a string having double slash using sed or awk in linux在 linux 中使用 sed 或 awk 替换具有双斜杠的字符串
【发布时间】:2015-10-12 07:38:54
【问题描述】:

我想替换这个

<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"/>

我正在遵循一种方法,首先找到行号,然后用所需的文本替换该行,但这并没有发生,因为&lt; 出现在行的开头。

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

我该如何解决这个问题,或者有更好的方法吗?

【问题讨论】:

    标签: linux string shell awk sed


    【解决方案1】:

    你可以使用 sed。

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

    基本 sed 使用基本正则表达式引擎进行匹配。在 BRE 中,\(..\) 称为捕获组。因此,这将捕获从属性标签到值参数存在的所有字符。并且直到? 的剩余字符由[^?]* 匹配,这意味着匹配除? 之外的任何字符,零次或多次。

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

    【讨论】:

    • 抱歉我之前的评论不够清楚。我希望在较小的部分中解释命令,例如为什么使用 ~ 以及如何进行替换等
    • 感谢您的解释,但如果第 1 点 - “匹配的字符在替换过程中会自动删除。”那为什么替换后出现&lt;property *name="sourceUrl" *value=?要点2 - 使用*value 为什么在value 之前使用*
    • 1.我在这里所说的匹配是指匹配但未捕获。所以[^?]*匹配的字符满足这个条件。此外,如果您在替换部分中没有提及\1,它也会被删除。 2.看前面的字符,是空格。 space 匹配零个或多个空格。为什么我包括在这里意味着,如果有两个空格怎么办。
    • 而正确的空格匹配方式是[[:blank:]][[:space:]]至少一个空格,需要加上\+[[:blank:]]\+
    猜你喜欢
    • 1970-01-01
    • 2019-11-29
    • 2019-08-07
    • 1970-01-01
    • 2014-09-17
    • 2018-01-29
    • 2015-10-25
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多