Regex 将一条语句替换为另一条具有shell脚本的语句

Regex 将一条语句替换为另一条具有shell脚本的语句,regex,bash,shell,sed,Regex,Bash,Shell,Sed,我有一句话需要替换。原始格式如下所示: f.STRING.focus(); 其中,字符串是[:alpha://code>和[:digit://code>(正则表达式)的组合。 我的目的是把它改成 highlight("STRING"); 例如: f.abCDef12345.focus() ---> highlight("abCDef12345"); f.ip2.focus() ---> highlight("ip2"); 我可以轻松地

我有一句话需要替换。原始格式如下所示:

f.STRING.focus();
其中,
字符串
[:alpha://code>和
[:digit://code>(正则表达式)的组合。
我的目的是把它改成

highlight("STRING");
例如:

f.abCDef12345.focus()    --->     highlight("abCDef12345");
f.ip2.focus()            --->     highlight("ip2");
我可以轻松地使用
sed
替换数百个html文件的语句。但是,我不知道如何在shell脚本中获取
字符串

程序可描述如下:

For each html:
    For the STRING which matches the pattern:
        1. Assign it to a parameter.
        2. Insert that STRING to highlight("STRING");
        3. Replace the old one "f.STRING.focus();" to "highlight("STRING");"
但我不知道如何用shell脚本编写它们。。。任何暗示都将不胜感激

更新:

  • 请清楚地描述你的剧本。太谢谢你了
  • 对不起,弄错了
    STRING
    是and
    [:alpha:][/code>和
    [:digit:][/code>的组合。因此,这里提到的示例
    f.ip2.focus()
    是有意义的
    sed-i的s/b.\(STRING\).focus()/highlight(“\1”)/g”文件将实现此功能

    #echo“b.STRING.focus()”| sed的s/b.\(STRING\).focus()/highlight(“\1”)/g'
    突出显示(“STRING”)
    sed-i的s/b.\(STRING\)。focus()/highlight(“\1”)/g”文件将起作用

    #echo“b.STRING.focus()”| sed的s/b.\(STRING\).focus()/highlight(“\1”)/g'
    
    突出显示(“字符串”)
    一个
    awk
    版本:

    echo 'f.STRING.focus("Some data")' | awk '{gsub(/[[:alpha:]]\.[[:alpha:]]+\.focus\(/,"highlight(")}1'
    highlight("Some data")
    
    使用
    sed

    echo 'b.STRING.focus("Some data")' | sed 's/[[:alpha:]]\.[[:alpha:]]*\.focus/highlight/g'
    highlight("Some data")
    

    awk
    版本:

    echo 'f.STRING.focus("Some data")' | awk '{gsub(/[[:alpha:]]\.[[:alpha:]]+\.focus\(/,"highlight(")}1'
    highlight("Some data")
    
    使用
    sed

    echo 'b.STRING.focus("Some data")' | sed 's/[[:alpha:]]\.[[:alpha:]]*\.focus/highlight/g'
    highlight("Some data")
    
    尝试以下方法:

    #!/bin/bash
    
    while read line
    do
        sed 's/f\.\([0-9a-zA-Z]*\)\.focus()/highlight("\1")/g' $line
    done < <(find . -type f  -name '*.html')
    
    在本例中,我们没有文件,而是希望对命令输出的每一行进行操作,输入
    file
    ,然后对其进行操作

    更新

    正如@tripleee所指出的,while循环可以完全丢弃:

    sed -i.bak 's/f\.\([0-9a-zA-Z]*\)\.focus()/highlight("\1")/g' $(find . -type f  -name '*.html')
    
    sed'…'$(find…
    构造在子shell中执行
    $()
    中的部分,将所有匹配文件作为参数传递给sed命令,如下所示

    sed '...' ./c/file.html ./a/file.html ./b/file.html ./d/file.html
    
    如果您有很多html文件,shell可能会因为命令行太长而抛出错误;如果是这样的话,
    xargs
    就是你的朋友(男人xargs)

    ..或者(Linux充满了),让
    find
    为所有匹配的文件执行sed部分(一次一个),这样您就不会冒命令行过长的风险:

    find . -type f  -name '*.html' -exec sed 's/f\.\([0-9a-zA-Z]*\)\.focus()/highlight("\1")/g' {} \;
    
    尝试以下方法:

    #!/bin/bash
    
    while read line
    do
        sed 's/f\.\([0-9a-zA-Z]*\)\.focus()/highlight("\1")/g' $line
    done < <(find . -type f  -name '*.html')
    
    在本例中,我们没有文件,而是希望对命令输出的每一行进行操作,输入
    file
    ,然后对其进行操作

    更新

    正如@tripleee所指出的,while循环可以完全丢弃:

    sed -i.bak 's/f\.\([0-9a-zA-Z]*\)\.focus()/highlight("\1")/g' $(find . -type f  -name '*.html')
    
    sed'…'$(find…
    构造在子shell中执行
    $()
    中的部分,将所有匹配文件作为参数传递给sed命令,如下所示

    sed '...' ./c/file.html ./a/file.html ./b/file.html ./d/file.html
    
    如果您有很多html文件,shell可能会因为命令行太长而抛出错误;如果是这样的话,
    xargs
    就是你的朋友(男人xargs)

    ..或者(Linux充满了),让
    find
    为所有匹配的文件执行sed部分(一次一个),这样您就不会冒命令行过长的风险:

    find . -type f  -name '*.html' -exec sed 's/f\.\([0-9a-zA-Z]*\)\.focus()/highlight("\1")/g' {} \;
    
  • f\.
    匹配
    f.
  • \([a-zA-Z0-9]\+\)
    匹配一个或多个字母数字字符,并将匹配的
    字符串存储在变量
    1
  • \.focus()
    匹配
    .focus()
  • 高亮显示(“\1”)
    用变量
    1
    ->
    的给定文本和值替换整个匹配的模式(“字符串”)
  • f\.
    匹配
    f.
  • \([a-zA-Z0-9]\+\)
    匹配一个或多个字母数字字符,并将匹配的
    字符串存储在变量
    1
  • \.focus()
    匹配
    .focus()
  • 高亮显示(“\1”)
    用变量
    1
    ->
    的给定文本和值替换整个匹配的模式(“字符串”)
  • 您可以使用此sed:

    sed -i.bak 's/f\.\([[:alnum:]]\+\).focus()/highlight("\1")/g' file.html
    
    这里是sed的发现

    f.<string-with-1-and-more-alpha-numerics>.focus()
    
    其中“\1”是匹配组1的反向引用,您可以使用此sed:

    sed -i.bak 's/f\.\([[:alnum:]]\+\).focus()/highlight("\1")/g' file.html
    
    这里是sed的发现

    f.<string-with-1-and-more-alpha-numerics>.focus()
    

    其中“\1”是匹配组#1的反向引用

    您不能在多个文件上使用sed和regexp吗?我不确定我的想法是否正确。你不能在多个文件上使用sed和regexp吗?我不确定我的想法是否正确。你能给你的代码添加一些解释吗?我完全无法理解。基本上,正如所有其他人所说,sed表达式左侧括号之间的表达式是通过在右侧使用\ \来恢复的。您可以为代码添加一些解释吗?基本上,正如所有其他人所说,sed表达式左侧括号之间的表达式是通过在右侧使用\ \来恢复的。我不知道为什么要在
    [:alpha://code>周围添加
    括号
    ,而
    (“\1”)
    的确切含义是什么?另外,很抱歉,我无法理解最后一行中的最后一条语句
    doneredirection unexpected
    。可能是您的bash实际上是dash的符号链接。Dash不支持进程替换。请检查
    ls-l/bin/bash
    或您是否使用
    /bin/sh
    作为您的shebang?嗯。。。在
    done>中,done和second之间的空格done<您不会将任何内容传递给
    done
    。“完成”终止while循环。我不知道为什么要在
    [:alpha:][/code>周围添加
    括号,以及
    (“\1”)
    的确切含义是什么?另外,很抱歉,我无法理解最后一行中的最后一条语句
    doneredirection unexpected
    。可能是您的bash实际上是dash的符号链接。Dash不支持进程替换。请检查
    ls-l/bin/bash
    或您是否使用
    /bin/sh
    作为您的shebang?嗯。。。在
    done>中,done和second之间的空格done<您不会将任何内容传递给
    done
    。完成