【问题标题】:Grep, Sed... Awk to modify lines in a fileGrep, Sed... awk 修改文件中的行
【发布时间】:2014-02-02 10:03:03
【问题描述】:

我已经搜索过这个,但我没有找到我正在寻找的确切内容。

我想要做的是在同一个文件中替换包含名称中带有“PATTERN”文本的 jar 文件的所有行,以便我可以在这些行中添加一个带有这些 jar 文件源代码的新属性。这些 jar 的源代码将始终位于相同的相对文件夹中(即 path1/lib/a.jar -> path1/src/java)

这方面的一个例子。这是我的原始文件:

<classpathentry path="/sde/ATG/ATG10.1.2/Momentum/Search/I18N/lib/MOM-Search-I18N-0.23-ECI.jar" />
<classpathentry path="/sde/ATG/ATG10.1.2/DAS/lib/axis-1.4.jar" />
<classpathentry path="/sde/ATG/ATG10.1.2/REST/lib/org.json.jar" />
<classpathentry path="/sde/ATG/ATG10.1.2/Momentum/StoreFront/lib/MOM-Search-I18N-Index-0.23-ECI.jar" />

我想得到这个:

<classpathentry path="/sde/ATG/ATG10.1.2/Momentum/Search/I18N/lib/MOM-Search-I18N-0.23-ECI.jar" sourcepath="/sde/ATG/ATG10.1.2/Momentum/Search/I18N/src/main/java" />
<classpathentry path="/sde/ATG/ATG10.1.2/DAS/lib/axis-1.4.jar" />
<classpathentry path="/sde/ATG/ATG10.1.2/REST/lib/org.json.jar" />
<classpathentry path="/sde/ATG/ATG10.1.2/Momentum/StoreFront/lib/MOM-Search-I18N-Index-0.23-ECI.jar" sourcepath="/sde/ATG/ATG10.1.2/Momentum/StoreFront/src/main/java"/>

我需要在带有我的模式的行中添加一个 sourcepath 属性,并且该 sourcepath 值应该取路径值的根。

作为

grep -o 'path="[/-.0-9A-Za-z]*/lib/MOM[-.0-9A-Za-z]*.jar"' test.txt 

给我包含我正在寻找的罐子的行的行,我认为这会解决我的问题:

cat test.txt | sed -r 's|path="[/-.0-9A-Za-z]*/lib/MOM[-.0-9A-Za-z]*.jar"|\1 sourcepath="\2/main/src/main/java"/>|'

但是给了我这个错误:sed: -e expression #1, char 91: invalid reference \2 on `s' command's RHS

有什么想法吗?

谢谢大家!

【问题讨论】:

    标签: string shell replace sed grep


    【解决方案1】:

    你可以说:

    sed 's| \(path=.*\)\(/lib\)\(/MOM[^ ]*\)| \1\2\3 source\1/src/main/java"|' inputfile
    

    对于您的示例输入,它会产生:

    <classpathentry path="/sde/ATG/ATG10.1.2/Momentum/Search/I18N/lib/MOM-Search-I18N-0.23-ECI.jar" sourcepath="/sde/ATG/ATG10.1.2/Momentum/Search/I18N/src/main/java" />
    <classpathentry path="/sde/ATG/ATG10.1.2/DAS/lib/axis-1.4.jar" />
    <classpathentry path="/sde/ATG/ATG10.1.2/REST/lib/org.json.jar" />
    <classpathentry path="/sde/ATG/ATG10.1.2/Momentum/StoreFront/lib/MOM-Search-I18N-Index-0.23-ECI.jar" sourcepath="/sde/ATG/ATG10.1.2/Momentum/StoreFront/src/main/java" />
    

    【讨论】:

      【解决方案2】:

      使用sed 的基本搜索替换功能:

      sed 's|\(PATTERN[^ ]*\)|\1 sourcepath="/sde/ATG/ATG10.1.2/path1/src/main/java"|'
      

      【讨论】:

        【解决方案3】:

        $ cat injars.txt | sed -r 's%(^.* path="(.*)/lib/PATTERN-.*)/&gt;%\1 sourcepath="\2/src/main/java"/&gt;%'

        给予:

        <classpathentry path="/sde/ATG/ATG10.1.2/path1/lib/jar1.jar" />
        <classpathentry path="/sde/ATG/ATG10.1.2/path1/lib/PATTERN-jar1.jar"  sourcepath="/sde/ATG/ATG10.1.2/path1/src/main/java"/>
        <classpathentry path="/sde/ATG/ATG10.1.2/path2/lib/jar2.jar" />
        <classpathentry path="/sde/ATG/ATG10.1.2/path2/lib/PATTERN-jar2.jar"  sourcepath="/sde/ATG/ATG10.1.2/path2/src/main/java"/>
        <classpathentry path="/sde/ATG/ATG10.1.2/path3/lib/PATTERN-jar3.jar"  sourcepath="/sde/ATG/ATG10.1.2/path3/src/main/java"/>
        <classpathentry path="/sde/ATG/ATG10.1.2/path3/lib/jar3.jar" />
        <classpathentry path="/sde/ATG/ATG10.1.2/path4/lib/PATTERN-jar4.jar"  sourcepath="/sde/ATG/ATG10.1.2/path4/src/main/java"/>
        

        injars.txt 包含您的输入。

        【讨论】:

        • 感谢 jkbkot,问题是路径是硬编码的,并且可能因 jar 文件而异。所以sourcepath文件夹应该取路径属性文件夹,回一层加/main/java
        • 对不起,我截断了自己的消息...所以我需要提取“路径”属性中的绝对路径,对其进行操作以将其转换为源路径值并将其添加到路径属性旁边.
        • 没问题。我快速编写了命令,它可以被简化并按您的意愿工作 - 请参阅我的编辑。
        • 您可能需要更多地调整正则表达式以获得更多样化的输入。
        • 我收到错误消息,例如“'s' 命令的 RHS 上的无效引用 \1”¿任何想法?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-19
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多