我只想删除第一个和最后一个双引号
输入:
word1 -word2 {word3} -word4 {"word5 'word6' "word7 word8" .word9"} -word10 (word11)
word1 -word2 {word3} -word4 {"word5 'word6' word7 word8 .word9"} -word10 (word11)
word1 -word2 {word3} -word4 {"word5 'word6' "word7 (word8)" .word9"} -word10 (word11)
预期输出:
word1 -word2 {word3} -word4 {word5 'word6' "word7 word8" .word9} -word10 (word11)
word1 -word2 {word3} -word4 {word5 'word6' word7 word8 .word9} -word10 (word11)
word1 -word2 {word3} -word4 {word5 'word6' "word7 (word8)" .word9} -word10 (word11)
尝试删除第一个
"
,但没有成功:
sed 's/"\({\)/\1/g' inputfile > outputfile
删除行中找到的第一个双引号,即“{”之后和“}”之前可以接受。
假设单词也可以有不同的长度。
您可以将此 sed 与捕获组一起使用:
sed -E 's/\{"(.*)"}/{\1}/' file
word1 -word2 {word3} -word4 {word5 'word6' "word7 word8" .word9} -word10 (word11)
word1 -word2 {word3} -word4 {word5 'word6' word7 word8 .word9} -word10 (word11)
word1 -word2 {word3} -word4 {word5 'word6' "word7 (word8)" .word9} -word10 (word11)
此处模式
{"(.*)"}
匹配 {"
和 "}
之间的最长匹配,并将中间的测试捕获到捕获组中。
第一个解决方案: 对于显示的示例,请尝试以下 GNU
awk
代码。使用 match
函数,其中使用正则表达式 (^.*{)"(.*)"(}.*$)
创建 3 个捕获组并将其值保存到名为 arr 的数组中,如果找到真正的匹配,则只需打印数组的所有值即可获得所需的输出。
awk 'match($0,/(^.*{)"(.*)"(}.*$)/,arr){print arr[1] arr[2] arr[3]}' Input_file
这里是使用正则表达式的在线演示。
第二个解决方案: 或者,如果您具有与所示示例相同的数据,并且每行仅出现
{"
和 "}
1 次,请尝试执行以下操作。
awk '{sub(/{"/,"{");sub(/"}/,"}")} 1' Input_file
我将利用 GNU
AWK
来完成此任务,让 file.txt
内容为
word1 -word2 {word3} -word4 {"word5 'word6' "word7 word8" .word9"} -word10 (word11)
word1 -word2 {word3} -word4 {"word5 'word6' word7 word8 .word9"} -word10 (word11)
word1 -word2 {word3} -word4 {"word5 'word6' "word7 (word8)" .word9"} -word10 (word11)
然后
awk 'BEGIN{FPAT="\"|[^\"]*";OFS=""}{$2=$(NF-1)="";print}' file.txt
提供输出
word1 -word2 {word3} -word4 {word5 'word6' "word7 word8" .word9} -word10 (word11)
word1 -word2 {word3} -word4 {word5 'word6' word7 word8 .word9} -word10 (word11)
word1 -word2 {word3} -word4 {word5 'word6' "word7 (word8)" .word9} -word10 (word11)
说明:我通知 GNU
AWK
该字段要么是单个 "
要么是零个或多个非 "
,并且输出中的字段之间不应该添加任何内容。然后,对于每一行,我将第二个字段(第一个"
)和最后一个字段(最后一个"
)之前的字段设置为空字符串,即删除它。 免责声明此解决方案假设 "
绝不是第一个字符,并且 "
绝不是该行的最后一个字符。
(在 GNU Awk 5.1.0 中测试)