Bash Regex用相对路径替换绝对路径

时间:2014-04-29 11:06:39

标签: regex bash

我使用以下代码来迭代一些xml文件。

for i in ./*.xml; do
    some line replacing content in the file $i
done

在每个文件中,我想要替换描述绝对路径的所有字符串及其相对路径从某个目录开始。


其中一个xml文件:

之前:/home/user/workspace/proj/bin

之后:./proj/bin

如何在for循环中使用一行(regexp)bash执行此操作?如果你能描述正则表达式会很好。


我可以这样做吗?:sed -i's /.*(/ proj)/. $ 1 / g'$ i

  1. 全球逐行替换。
  2. 尝试匹配路径的开头。
  3. 保存我要保留的部分并预先添加。
  4. 这不起作用,但这是一个想法

2 个答案:

答案 0 :(得分:2)

  

我可以这样做:

sed -i 's/.*(/proj)/.$1/g' $i

是的,你可以。你只需要

  • 要么逃避/,要么
  • 使用不同的分隔符。
  • 转义匹配括号

我更喜欢后一种方法:

for i in ./*.xml; do
    sed -i 's:\S*\(/proj\):.$1:g' "$i"
done

解释了"$i"的原因in comments

在模式中使用\S*的原因:假设您有一些字符串:

  

我将转到/home/user/workspace/proj/bin并立即删除内容。

不使用\S*,您最终会得到:

  

./proj/bin并立即删除内容。

而不是:

  

我将转到./proj/bin并立即删除内容。

答案 1 :(得分:0)

是否有必要使用正则表达式?为什么不简单:

find . -type f -name "*.xml"

通过这种方式,您将直接获得相对路径(当然,根据您的CWD)。