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