grep双引号内的字符串

时间:2017-02-16 21:45:56

标签: linux sed grep

我尝试grep一个路径字符串,所有内容都是双引号。 For循环遍历test.txt文件,它会搜索new1.xml以查找匹配项。如果找到,它会在路径中打印出一个字符串。

预期输出

abc/test/test
abc/test/test
cd/test1/test2
cdf

的test.txt

test/test
test/test
test1/test2
test1

new1.xml

<abc name="test/test" path="abc/test/test"  />
<abc name="test/test1" path="abc/test/test1"  />
<abc name="test1/test2" path="cd/test1/test2" />
<path="cdf" name="test1" />

脚本

for f in test.txt
    do
    echo "Processing $f"
        paste $f | while read lines; do
            results=`cat new1.xml | grep -o "name.*$lines.*" | grep -o 'path.*' | sed 's/[^"]*"\([^"]*\)".*/\1/'`
        done
    done

输出

abc/test/test
abc/test/test1

2 个答案:

答案 0 :(得分:1)

在您的代码中,如果您将最后一部分调整为:

....|grep -o 'path=\".*\"' |sed 's/[^"]*"\([^"]*\)".*/\1/' 

应该有效。我没有测试你的整个代码,只测试了grep + sed。

另外我可以看到sed命令周围有一些反引号。如果是这样,他们需要被删除。

在我的测试中,这有效:

echo -e "<abc name="test/test" path=\"abc/test/test\"  />" |grep -o 'path=\".*\"' |sed 's/[^"]*"\([^"]*\)".*/\1/'
abc/test/test

另一种在没有循环但使用单个命令的情况下隔离所需内容的方法是

grep -F -f test.txt new1.xml |grep -o 'path=\".*\"' |sed 's/[^"]*"\([^"]*\)".*/\1/' #or a simpler sed like |sed 's/path=//; s/\"//g'

grep -F:搜索固定字符串,而不是正则表达式      -f:从文件加载模式

另一种选择:

echo -e "<abc name="test/test" path=\"abc/test/test\"  />" |sed -e 's/^.*path=\"//; s/\" .*$//g'
#in your case:
grep -F -f test.txt new1.xml |sed -e 's/^.*path=\"//; s/\" .*$//'

更新:使用单行测试:

$ cat file3
test/test
test/test
test1/test2
test1

$ cat file4
<abc name="test/test" path="abc/test/test"  />
<abc name="test/testsdk" path="abc/test/testsdk" />
<abc name="test/test" path="abc2/test/test"  />
<abc name="test1/test2" path="ggg/test1/test2"  />
<abc name="test2/test2" path="vvv/test2/test2"  />
<path="cdf" name="test1" />

$ grep -F -f file3 file4 |sed 's/^.*path=//; s/\"//g; s/ .*$//g'
abc/test/test
abc/test/testsdk
abc2/test/test
ggg/test1/test2
cdf

答案 1 :(得分:1)

您可以更有效地编写循环,并使用sed代替多个grep来获得您想要的内容:

for f in test.txt; do
  echo "Processing $f"
  while read line; do
    grep 'name="'$line'"' new1.xml 
  done < "$f" | sed -E 's/.+path="([^"]+)".+/\1/'
done

对于您的示例,上面的脚本提供了此输出:

Processing test.txt
abc/test/test

如果您只处理一个文件,则不需要外循环:

  while read line; do
    grep 'name="'$line'"' new1.xml
  done < "test.txt" | sed -E 's/.+path="([^"]+)".+/\1/'