我最近开始学习 bash,但在做作业时遇到了问题,所以我有一个 txt 文件,其中包含类似的内容
foo:abc:200:1:1:1
foobar:asd:100:3:2:1
bar:test:100:2:2:2
其中第一列是书名,后面是作者姓名,然后是价格、可用数量和已售出数量,全部用分隔符“:”分隔
此处的目标是根据用户输入的名称和作者删除一本书。
我四处搜索,发现 sed 可能可以帮助我解决这个问题,我尝试通过单独删除基于标题的 base 来测试 sed
sed /"foo"/d Book.txt
我期望输出是
foobar:asd:100:3:2:1
bar:test:100:2:2:2
但是输出是
bar:test:100:2:2:2
这告诉我 txt 文件中包含“foo”的任何行都将被删除
所以我想问一下
- 有什么方法可以使用 sed 以便它只删除完全匹配而不是包含 foo 的行?
- 有没有办法在 sed 中使用定界符,这样我就可以同时使用标题和作者?
- 我应该使用 sed 以外的东西吗?
最佳答案
使用 sed
最好使用:
sed -E '/(^|:)foo(:|$)/d' file
foobar:asd:100:3:2:1
bar:test:100:2:2:2
这确保 foo
前面有 start 或 :
,后面有 end 或 :
。
然而,这项工作更适合 awk
,因为数据由冒号分隔:
awk -F: '$1 != "foo"' file
关于regex - 有没有办法使用 sed 只删除完全匹配的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54143382/