Bash Regexp将绝对路径替换为相对路径
我使用以下代码遍历一些xml文件Bash Regexp将绝对路径替换为相对路径,regex,bash,Regex,Bash,我使用以下代码遍历一些xml文件 for i in ./*.xml; do some line replacing content in the file $i done 在每个文件中,我都希望将描述绝对路径的所有字符串替换为从某个dir开始的相对路径 在其中一个xml文件中: 之前:/home/user/workspace/proj/bin 之后:/proj/bin 如何在for循环中使用一行(regexp)bash实现这一点?如果您能描述一下regexp,那就太好了。 我可以这
for i in ./*.xml; do
some line replacing content in the file $i
done
在每个文件中,我都希望将描述绝对路径的所有字符串替换为从某个dir开始的相对路径
在其中一个xml文件中: 之前:
/home/user/workspace/proj/bin
之后:/proj/bin
如何在for循环中使用一行(regexp)bash实现这一点?如果您能描述一下regexp,那就太好了。
我可以这样做吗?:sed-I's/*(/proj)/.$1/g'$I
这不起作用,但这是一个想法是否需要使用regexp?为什么不简单地:
find-类型f-名称“*.xml”
通过这种方式,您将直接获得相对路径(当然,根据您的CWD)
我可以这样做吗:
sed -i 's/.*(/proj)/.$1/g' $i
是的,你可以。你只需要
- 退出
,或/
- 使用不同的分隔符
- 转义匹配括号
for i in ./*.xml; do
sed -i 's:\S*\(/proj\):.$1:g' "$i"
done
解释了
“$i”
的原因
在模式中使用\S*
的原因:假设您有如下字符串:
我现在就去/home/user/workspace/proj/bin
删除内容
如果不使用\S*
,您将得到:
/proj/bin
并立即删除内容
而不是:
我现在就去/proj/bin
删除东西
你试过什么吗?如果是这样的话,请包括您当前的尝试,这样会更容易了解需要解释的内容。我想我想要像sed-I的/(.*)\/proj//g'$iI这样的东西,我不想找到这些文件。我想替换文件中的内容您还应该注意将
“$I”
双引号引起来。一般来说,任何包含文件名的变量(以及大多数其他变量)都必须用双引号引起来。我尝试了这个方法,但无法使它工作。我运行:sed-I's:\\s*(/proj):.$1:g./error\u archiver.xml,但error\u archiver.xml文件保持不变。也许我没有正确使用sed。我尝试了sed-I's:\\s*(/proj):.$1:g./error\u archiver.xml>>新文件文件也没有更改,它不起作用:s试图找出为什么从未计算$1