gpt4 book ai didi

bash - Sed 无法更新长文本

转载 作者:行者123 更新时间:2023-11-29 09:39:29 24 4
gpt4 key购买 nike

考虑测试文件csf.conf:

CC_DENY = ""

运行命令:

sed -i -E 's/(CC_DENY *= *")[^"]+/\1AR,BE,CL,CN,CO,CS,ES,FR,GR,HK,IT,KO,PA,PE,PH,PL,RS,RU,SG,SK,TH,UA,VN,AE,AF,AL,AS,AZ,BA,BD,BF,BH,BJ,BN,CI,DJ,EG,EH,ER,ET,GM,GN,GW,IQ,IR,IS,JO,KG,KM,KW,KZ,LB,LY,MC,MK,ML,MR,MV,MY,NE,NG,OM,PK,PS,QA,SA,SD,SL,SN,SO,SY,TD,TJ,TM,TN,TR,UZ,XK,YE,YT/g' csf.conf

不替换文件中的匹配项。输出应如下所示:

CC_DENY="AR,BE,CL,CN,CO,CS,ES,FR,GR,HK,IT,KO,PA,PE,PH,PL,RS,RU,SG,SK,TH,UA,VN,AE,AF,AL..."

Sed v4.2.2,在 Debian 8 和 Centos 7 上结果相同

最佳答案

这与长文本无关,您的正则表达式与文件内容不匹配。将 [^"]+ 更改为 [^"]*,这样即使双引号 "" 之间没有任何内容,它也会匹配。看:

$ cat csf.conf
CC_DENY = ""

$ sed -E 's/(CC_DENY *= *")[^"]+/\1foo/' csf.conf
CC_DENY = ""

$ sed -E 's/(CC_DENY *= *")[^"]*/\1foo/' csf.conf
CC_DENY = "foo"

wrt 下面来自 OP 的评论表明这个 sed 命令有效:

$ cat file
LF_SPI = ""

$ sed -E 's/(LF_SPI *= *\")[^\"]+/\1blah/g' file
LF_SPI = ""

很明显,可以预见,不,事实并非如此。它根本不能,因为正则表达式元字符 + 表示 1 或更多 所以 [^\"]+ 声明必须至少有一个非-"" 之后,输入文件中不存在。顺便说一句,没有理由转义双引号。

关于bash - Sed 无法更新长文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40688906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com