Sed无法更新长文本

时间:2016-11-19 03:23:41

标签: bash sed

考虑测试文件 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上的结果相同

3 个答案:

答案 0 :(得分:4)

这与长文本无关,您的正则表达式与文件内容不匹配。将PickRandom() func PickRandom() { let RandomNumber = random() % QuizObject.count // error here Btn1.setTitle(QuizObject[RandomNumber].Answers[0]) Btn2.setTitle(QuizObject[RandomNumber].Answers[1]) Btn3.setTitle(QuizObject[RandomNumber].Answers[2]) Btn4.setTitle(QuizObject[RandomNumber].Answers[3]) QuestionLabel.setText(QuizObject[RandomNumber].Question) RealAnswer = QuizObject[RandomNumber].Answer } func RightWrong(){ if (NumberPicked == RealAnswer) { PickRandom() QuestionLabel.setTextColor(UIColor.white) } else { QuestionLabel.setTextColor(UIColor.red) } } 更改为[^"]+,即使双引号[^"]*之间没有任何内容,它也会匹配。看:

""

以下来自OP的评论说明这​​个sed命令有效:

$ 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"

显而易见,可以预见,不是。它根本不能,因为正则表达式元字符$ cat file LF_SPI = "" $ sed -E 's/(LF_SPI *= *\")[^\"]+/\1blah/g' file LF_SPI = "" 表示+所以1 or more表示[^\"]+之后必须至少有一个非"在输入文件中不存在。没有理由逃脱双引号btw。

答案 1 :(得分:2)

假设文件中的当前变量值为空。然后你的正则表达式不匹配,因为[^"]+表示“任何字符,除了双引号重复一次或多次”。

您可以通过将+量词替换为*(零次或多次)来解决此问题。但是假设该值包含双引号:

CC_DENY = "\""

然后[^"]*将匹配所有内容,直到达到值中的双引号。

因此,我建议使用以下命令:

# Put the variable value here
value='AR,BE\\" ... YE,YT';

sed -i -r 's/^( *CC_DENY *= *").*"/\1'"$value"'"/' csf.conf

另请注意,上面的表达式使用锚点作为行的开头。否则,如果配置文件中的变量值中存在CC_DENY = "...,则无法按预期匹配

答案 2 :(得分:0)

Sed肯定是错误的工具:

#!/usr/bin/awk -f
BEGIN {
  FS = OFS = "\42"
}
$2 = "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,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"