正则表达式匹配shell脚本中两个特定字符之间的字符

m1m5dgzv  于 2022-12-13  发布在  Shell
关注(0)|答案(1)|浏览(202)

我想清理我的文件之前/之后保存,所以我必须删除不必要的字符,我有那里。可悲的是,即使我的regex是工作在regex 101,它不工作在shell脚本我写的。
我通过以下方式从Kubernetes获取我的列表

kubectl get pods -n $1 -o jsonpath='{range .items[*]}{@.spec.containers[*].image}{","}{@.status.containerStatuses[*].imageID}{"\n"}{end}'

然后我将其保存到temp文件中,并使用sed清除它-正则表达式应该匹配,并且(sed应该)删除,@之间的任何字符(还应该删除@)。

sed -i 's/(?<=\,)(.*?)(?<=\@)//g' temp

问题是这个正则表达式工作得很好(例如在Regex 101中),但不能与sed命令一起工作。我甚至尝试了awk,但得到了相同的输出。

awk '!/(?<=\,)(.*?)(?<=\@)/' temp

是我遗漏了什么,还是正则表达式在Unix/shell中的行为有所不同?
感谢您的意见。
文件内容示例(用于测试):

docker.elastic.co/elasticsearch/elasticsearch:7.17.5,docker-pullable://docker.elastic.co/elasticsearch/elasticsearch@sha256:76344d5f89b13147743db0487eb76b03a7f9f0cd55abe8ab887069711f2ee27d
docker.io/bitnami/kafka:3.3.1-debian-11-r11,docker-pullable://bitnami/kafka@sha256:be29db0e37b6ab13df5fc14988a4aa64ee772c7f28b4b57898015cf7435ff662
docker.io/bitnami/mongodb:6.0.3-debian-11-r0,docker-pullable://bitnami/mongodb@sha256:e7438d7964481c0bcfcc8f31bca2d73022c0b7ba883143091a71ae01be6d9edb
docker.io/bitnami/postgresql:14.1.0-debian-10-r80,docker-pullable://bitnami/postgresql@sha256:6eb9c4ab3444e395df159e2cad21f283e4bf30802958467590c886f376dc9959
docker.io/bitnami/zookeeper:3.8.0-debian-11-r47,docker-pullable://bitnami/zookeeper@sha256:0f3169499c5ee02386c3cb262b2a0d3728998d9f0a94130a8161e389f61d1462

预期输出:

docker.elastic.co/elasticsearch/elasticsearch:7.17.5,sha256:76344d5f89b13147743db0487eb76b03a7f9f0cd55abe8ab887069711f2ee27d
docker.io/bitnami/kafka:3.3.1-debian-11-r11,sha256:be29db0e37b6ab13df5fc14988a4aa64ee772c7f28b4b57898015cf7435ff662
docker.io/bitnami/mongodb:6.0.3-debian-11-r0,sha256:e7438d7964481c0bcfcc8f31bca2d73022c0b7ba883143091a71ae01be6d9edb
docker.io/bitnami/postgresql:14.1.0-debian-10-r80,sha256:6eb9c4ab3444e395df159e2cad21f283e4bf30802958467590c886f376dc9959
docker.io/bitnami/zookeeper:3.8.0-debian-11-r47,sha256:0f3169499c5ee02386c3cb262b2a0d3728998d9f0a94130a8161e389f61d1462
2w3rbyxf

2w3rbyxf1#

您正在尝试使用Perl扩展,而sed和Awk等更传统的正则表达式工具不支持这些扩展。
也许还可以参见Why are there so many different regular expression dialects?Stack Overflow regex tag info page
如果我能猜到你想做什么,你想简单地

sed -i 's/,[^@]*@/,/g' temp

如果希望每行只有一个匹配项,则不需要/g标志。
,@都不是正则表达式元字符;它们不需要转义。
通常您会希望避免使用临时文件或sed -i;也许只是

kubectl blah blah | sed 's/,[^@]*@/,/' > temp

创建文件,或者如果要进一步通过管道传送结果,请删除重定向。

相关问题