我想清理我的文件之前/之后保存,所以我必须删除不必要的字符,我有那里。可悲的是,即使我的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
1条答案
按热度按时间2w3rbyxf1#
您正在尝试使用Perl扩展,而
sed
和Awk等更传统的正则表达式工具不支持这些扩展。也许还可以参见Why are there so many different regular expression dialects?和Stack Overflow
regex
tag info page。如果我能猜到你想做什么,你想简单地
如果希望每行只有一个匹配项,则不需要
/g
标志。,
和@
都不是正则表达式元字符;它们不需要转义。通常您会希望避免使用临时文件或
sed -i
;也许只是创建文件,或者如果要进一步通过管道传送结果,请删除重定向。