删除第一个和最后一个双引号(最好是 sed/awk)

问题描述 投票:0回答:3

我只想删除第一个和最后一个双引号

输入:

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

删除行中找到的第一个双引号,即“{”之后和“}”之前可以接受。

假设单词也可以有不同的长度。

awk sed
3个回答
4
投票

您可以将此 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)

此处模式

{"(.*)"}
匹配
{"
"}
之间的最长匹配,并将中间的测试捕获到捕获组中。


3
投票

第一个解决方案: 对于显示的示例,请尝试以下 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

1
投票

我将利用 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 中测试)

© www.soinside.com 2019 - 2024. All rights reserved.