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
。完成