You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用sed为文件中未加引号的字段添加双引号

解决方案

你之前使用的命令存在两个核心问题:

  • 管道输入场景下加sed -i参数无效,-i参数的作用是直接修改指定磁盘文件,读取管道传入的流式内容时没有对应目标文件可写入;同时你先用grep -v过滤出了仅不带双引号的行,直接基于这个输出修改会丢失其余所有正常行
  • 替换逻辑存在缺陷,匹配单个大写字母就插入前引号的写法,会给所有命中的大写字母前都加引号,无法一次性包裹完整的目标字段

直接修改原文件

执行以下单条sed命令即可完成需求,不会改动已经带双引号的正常行,自动给未包裹的末尾字段整体加上双引号:

sed -i '/".*"$/!s/ [^ ]*$/ "&"/' test.txt

命令逻辑说明:

  • /".*"$/!:行匹配规则,跳过所有行尾已经存在双引号包裹内容的行,仅处理不符合该规则的异常行
  • s/ [^ ]*$/ "&"/:匹配行尾最后一个空格后跟随的所有连续非空格字符(即每行末尾的用户名字段),替换时保留原匹配内容,在其前后补充双引号,其中&代表匹配到的原始字段内容,不会修改字段本身的字符

不改动原文件、结果输出到新文件

如果需要保留原文件不变,将处理后的结果存入新文件(例如new_test.txt),使用如下命令即可:

sed '/".*"$/!s/ [^ ]*$/ "&"/' test.txt > new_test.txt

处理完成后文件内容如下,完全符合预期:

10.20.30.40 "User 1"
73.15.16.24 "NewUser"
124.18.21.17 "User 2"
27.76.58.248 "User 3"
39.16.87.227 "User 4"
211.129.20.52 "User 5"
175.15.118.110 "User 6"

注意:macOS系统自带的BSD版本sed要求-i参数后必须显式指定备份文件后缀,不需要备份的话传空字符串即可,对应修改原文件的命令为sed -i '' '/".*"$/!s/ [^ ]*$/ "&"/' test.txt


内容的提问来源于stack exchange,提问作者Canadian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 01:18:21