Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/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
Regex 在bash中搜索并替换字符串中的子字符串_Regex_Bash_Sed - Fatal编程技术网

Regex 在bash中搜索并替换字符串中的子字符串

Regex 在bash中搜索并替换字符串中的子字符串,regex,bash,sed,Regex,Bash,Sed,我有以下任务: 我必须替换几个链接,但只替换以结尾的链接。要吗 重要提示:文件中还有其他链接,但它们应该保持不变 <li><a href="MeinKonto.do">Einstellungen verwalten</a></li> 到 因此,我必须搜索与的链接。做,采取之前的一部分,并记住它,例如$a,替换为整个链接 <s:url action=' '/> 报价之间超过$a 我考虑过sed,但据我所知,sed只搜索整个

我有以下任务: 我必须替换几个链接,但只替换以结尾的链接。要吗

重要提示:文件中还有其他链接,但它们应该保持不变

<li><a href="MeinKonto.do">Einstellungen verwalten</a></li>
  • 因此,我必须搜索与的链接。做,采取之前的一部分,并记住它,例如$a,替换为整个链接

    <s:url action=' '/>
    
    
    
    报价之间超过$a

    我考虑过sed,但据我所知,sed只搜索整个字符串并替换它。 我还尝试将bash参数扩展与sed结合使用,但在引号和变量方面遇到了严重问题

    cat  ./src/main/webapp/include/stoBox2.jsp | grep -e '<a href=".*\.do">' | while read a;
    do
        b=${a#*href=\"};
        c=${b%.do*};
        sed -i 's/href=\"$a.do\"/href=\"<s:url action=\'$a\'/>\"/g' ./src/main/webapp/include/stoBox2.jsp;
    done;
    
    cat./src/main/webapp/include/stoBox2.jsp | grep-e“”|同时阅读a;
    做
    b=${a}*href=\“};
    c=${b%.do*};
    sed-i的/href=\“$a.do\”/href=\“\”/g./src/main/webapp/include/stoBox2.jsp;
    完成;
    
    有什么想法吗

    非常感谢。

    试试这个:

    sed -i "s%\(href=\"\)\([^\"]\+\)\.do%\1<s:url action='\2'/>%g" \
        ./src/main/webapp/include/stoBox2.jsp;
    
    sed-i“s%\(href=\“\)\([^\“]\+\)\.do%\1%g”\
    ./src/main/webapp/include/stoBox2.jsp;
    
    您可以使用括号(
    \(,\)
    )捕获模式,并在替换模式中使用它。
    在这里,我捕获一个不带任何
    但在
    之前的字符串。do
    \([^\“]\+\)\.do
    ),并插入它,但不带
    .do
    后缀(
    \2

    第二个模式中有一个
    /
    ,因此我使用
    %
    s来分隔表达式,而不是传统的
    /

    sed -i  sed 's#href="\(.*\)\.do"#href="<s:url action='"'\1'"'/>"#g' ./src/main/webapp/include/stoBox2.jsp
    

    参数
    -i
    用于直接修改您的文件。如果您不想这样做,只需将其删除。然后使用
    -tmp

    将结果保存到tmp文件中,您的链接是否总是用双引号括起来?如果您在同一行上有多个链接,并且其中一个链接(第一个除外)是
    。要修改,请执行
    gex将删除链接(
    sed
    贪婪,你的括号尽可能多)。无意冒犯,但我的解决方案有什么问题,让你发布了几乎相同的内容?@qole你检查过你的命令了吗?它只是遗漏了一些双引号或单引号。我想这里有\1表示
    href=”
    有点多余。
    href=“
    这件事对我来说并不多余,但还行。对于引号,是的,我检查了我的命令,对于OP的示例,它提供了所需的输出。你能提供更多的细节吗?您是否按照我的第一条评论中所述的输入尝试了您的命令?@qole是的,您在第一条评论中是对的,我应该添加一个
    [^\“]
    来避免它。对于您的命令,我刚刚遇到了错误,即
    不匹配。“
    我没有遇到此错误。如果您仍然拥有您键入的确切命令,或者您(或任何其他人)曾经复制过它,我很感兴趣。
    sed -i  sed 's#href="\(.*\)\.do"#href="<s:url action='"'\1'"'/>"#g' ./src/main/webapp/include/stoBox2.jsp
    
     's#href="\(.*\)\.do"#href="<s:url action='
    
     "'\1'"
    
     '/>"#g'