如何使用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
相关产品推荐
相关产品推荐

