Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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 sed-e“;s/^[^#][A-Z]/export/g";将删除第一个字母。。。如何防止这件事?_Regex_Linux_Sed - Fatal编程技术网

Regex sed-e“;s/^[^#][A-Z]/export/g";将删除第一个字母。。。如何防止这件事?

Regex sed-e“;s/^[^#][A-Z]/export/g";将删除第一个字母。。。如何防止这件事?,regex,linux,sed,Regex,Linux,Sed,假设我有这个文件: #!/bin/bash #t1.sh #There are so many comments here #I HAVE A PEN VAR=0 #I GOT AN APPLE mixed #APPLE PEN HERE VAR1=$APPLE_PEN 现在,我想在每个变量之前添加“export”,并在屏幕上打印结果。我用大写字母写了这些变量名,然后称之为sed命令: cat t1.sh|sed -e "s/^[^#][A-Z]/export /g" 但结果删除了第一个字

假设我有这个文件:

#!/bin/bash

#t1.sh
#There are so many comments here
#I HAVE A PEN
VAR=0
#I GOT AN APPLE
mixed
#APPLE PEN HERE
VAR1=$APPLE_PEN
现在,我想在每个变量之前添加“export”,并在屏幕上打印结果。我用大写字母写了这些变量名,然后称之为sed命令:

cat t1.sh|sed -e "s/^[^#][A-Z]/export /g"
但结果删除了第一个字母,如:

#I HAVE A PEN
export R1=0
#I GOT AN APPLE
mixed
#APPLE PEN HERE
export R2=$APPLE_PEN
为什么呢?如何解决


顺便说一句,
我可以通过这种方式轻松地在记事本++上进行常规交换:


sed也会支持这样的交换吗?如果是,如何制作?

您需要在图案周围添加一个捕获组,并在RHS部分使用反向引用来恢复结果中捕获的文本:

"s/^\([^#][A-Z]\)/export \1/"
    ^^         ^^        ^^
您需要对括号进行转义,因为您使用的是BRE POSIX正则表达式风格,其中未转义的
与文字开括号匹配。

这可能适合您(GNU-sed):

这将是这样的:如果行的第一个字符不是散列,第二个字符是大写字母,那么在行的开头插入
export
,后跟一个空格

或者,如果您喜欢使用“反向引用”:


注意:不需要替换上的
g
标志,因为一次读取一行时只能有一个行的开头。

您没有在sed命令中使用backreference。请尝试
sed-e“s/^\([^#][a-Z]\/export\1/g”
sed '/^[^#][A-Z]/s/^/export /' file
sed 's/^[^#][A-Z]/export &/ file