regex - sed -e "s/^[^#][A-Z]/export/g"将删除第一个字母...如何防止这种情况?

标签 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

现在我想在每个变量之前添加“导出”并在屏幕上打印结果。我用大写写了这些变量名,然后调用了这个 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

这是为什么呢?怎么解决?


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

sed 也支持这样的交换吗?如果可以的话,如何制作?

最佳答案

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

"s/^\([^#][A-Z]\)/export \1/"
    ^^         ^^        ^^

您需要转义括号,因为您使用的是 BRE POSIX 正则表达式风格,其中未转义的 ( 与文字左括号匹配。

关于regex - sed -e "s/^[^#][A-Z]/export/g"将删除第一个字母...如何防止这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42620036/

相关文章:

javascript - 字符串中的第一个和最后一个数字?

"|"和数字的 php 正则表达式

linux - 为什么 touch $(ls).bla 只创建一个文件

php - 如何从大数据库中的文本中检测特定关键字?

php - MySQL 查询中的 YouTube 视频正则表达式

java - 如何使用 Jsvc 将 Java 程序作为守护进程启动

linux - 跟踪程序读取文件的进度?

python - ffmpeg|sed 命令的 subprocess.call 格式?

linux - 使用 sed 删除包含特定单词的段落

linux - 使用 'sed' shell 命令部分替换字符串