Grep,Sed ...要修改文件中的行

时间:2014-01-14 11:04:51

标签: string shell replace sed grep

我已经搜索了这个,但我找不到我到底想要的东西。

我想要做的是在同一个文件中替换包含名称中带有“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表达式#1,char 91:`s'命令的RHS上的无效引用\ 2

有什么想法吗?

谢谢你们!

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

给出:

<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。

答案 2 :(得分:0)

你可以说:

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