提问人:Derek Rickmon 提问时间:11/1/2023 最后编辑:zdimDerek Rickmon 更新时间:11/11/2023 访问量:49
使用 sublime 的正则表达式问题(查找/替换)
Regex question using sublime (Find/Replace)
问:
好的,使用 bash 终端或在 sublime 之类的东西中查找/替换,我想找到:
BLK=$'\e[0;30m'
RED=$'\e[0;31m'
GRN=$'\e[0;32m'
YEL=$'\e[0;33m'
BLU=$'\e[0;34m'
MAG=$'\e[0;35m'
CYN=$'\e[0;36m'
WHT=$'\e[0;37m'
前 3 个字母和 =$,并用前 3 个别名替换它,前 3 个字母=“echo -e(引号之后和最后一个引号之前的所有内容)。到目前为止,甚至还没有:
这是我卡住的地方:
我可以找到/替换为别名(前 3 个字母),但无法完成其余部分。该正则表达式如下所示:
Find: ([A-Z]{3,5})(\=\$)(?:\')(\\e\[\d\;?\d{1,3}m)(?:\')
Replace: alias \1
但似乎无法完成整个事情。使用崇高的文本编辑器。
答:
0赞
Sree Kumar
11/1/2023
#1
它可能与替换字符串一起使用;模式是正确的。(我只熟悉 Java,并在此处发布一个有效的解决方案。请查看它是否有助于您创建等效的 Sublime 替代品。
String s = "BLK=$'\\e[0;30m'\nRED=$'\\e[0;31m'\nGRN=$'\\e[0;32m'";
Pattern p = Pattern.compile( "([A-Z]{3,5})(\\=\\$)(?:\\')(\\\\e\\[\\d\\;?\\d{1,3}m)(?:\\')" );
Matcher m = p.matcher( input );
while( m.find() ){
String repl = m.replaceAll( "alias $1='echo -e $3'" );
System.out.println( repl );
}
如果您不熟悉 Java:
- 由于有许多转义字符,该模式可能看起来令人困惑。但是我使用了与您发布的完全相同的模式,即.
\
([A-Z]{3,5})(\=\$)(?:\')(\\e\[\d\;?\d{1,3}m)(?:\')
- 在 Java 中,这些组被标识为 、 等,而不是 、 等。
$1
$2
\1
\2
结果
对于代码中的值,我从您的问题中获取,以下是输出:input
alias BLK='echo -e \e[0;30m'
alias RED='echo -e \e[0;31m'
alias GRN='echo -e \e[0;32m'
1赞
The fourth bird
11/1/2023
#2
使用 Sublime,您可以使用 2 个捕获组,而不是将捕获组添加到第一个捕获组,并将关闭添加到第二个捕获组,因为您希望保留这些捕获组。=
'
您可以找到:
([A-Z]{3,5}=)\$'(\\e\[\d\;?\d{1,3}m')
并替换为:
alias $1'echo -e $2
观看正则表达式演示
请注意,您不必转义引号,您可以省略非捕获组,因此只是(?:\')
'
0赞
Reilas
11/11/2023
#3
请尝试以下捕获模式。
(.+?)=\$'(.+?)'
以及以下替换文本。
alias $1='echo -e $2'
输出
alias BLK='echo -e \e[0;30m'
alias RED='echo -e \e[0;31m'
alias GRN='echo -e \e[0;32m'
alias YEL='echo -e \e[0;33m'
alias BLU='echo -e \e[0;34m'
alias MAG='echo -e \e[0;35m'
alias CYN='echo -e \e[0;36m'
alias WHT='echo -e \e[0;37m'
评论
perl
perl