如何从文件中删除含精确匹配模式的带引号字符串
解决方案
针对你的需求,分两种常见场景给出实现方法:
场景1:每行一个带引号条目
如果file.txt里每行仅包含一个带引号的域名(比如单行就是"tntcloudid"或"vanity-tntcloud"),直接用sed删除整行即可:
sed -E '/^"tntcloudid"$|^"vanity-tntcloud"$/d' file.txt
这个命令会精确匹配整行完全等于"tntcloudid"或"vanity-tntcloud"的行并删除,不会影响"vanity-tntcloud1"这类后缀带额外字符的条目。
场景2:一行包含多个带引号条目
如果一行里有多个用逗号/空格分隔的带引号域名(比如"a.com", "tntcloudid", "vanity-tntcloud1"),需要单独删除目标条目而保留其他内容,推荐用以下sed命令:
sed -E ' s/"tntcloudid",?\s*|,"tntcloudid"\s*|^"tntcloudid"\s*//g; s/"vanity-tntcloud",?\s*|,"vanity-tntcloud"\s*|^"vanity-tntcloud"\s*//g; s/^,\s*|\s*,//g ' file.txt
命令说明:
- 前两行分别处理
tntcloudid和vanity-tntcloud的三种出现形式:- 条目在行首:
^"xxx"\s* - 条目在行中且后跟逗号空格:
"xxx",?\s* - 条目在行中且前跟逗号空格:
,\s*"xxx"
- 条目在行首:
- 第三行清理删除后可能遗留的行首/行尾多余逗号和空格,保证输出格式整洁。
如果觉得sed的正则逻辑繁琐,也可以用awk实现,代码可读性更强:
awk -F '[",[:space:]]+' '{ for(i=1;i<=NF;i++){ if($i !~ /^(tntcloudid|vanity-tntcloud)$/){ printf "\"%s\"%s", $i, (i<NF?", ":"") } } print "" }' file.txt
awk命令说明:
- 用引号、逗号、空格作为分隔符拆分每行内容
- 遍历所有字段,仅保留不是
tntcloudid或vanity-tntcloud的条目 - 重新将保留的条目按
"域名", "域名"的格式输出
内容的提问来源于stack exchange,提问作者bessey
相关产品推荐
相关产品推荐

