Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Regexp将绝对路径替换为相对路径_Regex_Bash - Fatal编程技术网

Bash Regexp将绝对路径替换为相对路径

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,那就太好了。 我可以这

我使用以下代码遍历一些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,那就太好了。
我可以这样做吗?: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