regex - 有没有办法使用 sed 只删除完全匹配的字符串?

标签 regex sed

我最近开始学习 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”的任何行都将被删除

所以我想问一下

  1. 有什么方法可以使用 sed 以便它只删除完全匹配而不是包含 foo 的行?
  2. 有没有办法在 sed 中使用定界符,这样我就可以同时使用标题和作者?
  3. 我应该使用 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/

相关文章:

c# - RegEx 字表现 :\w vs [a-zA-Z0-9_]

awk - 如何仅从每一列的一行中的第一个单词中删除特定字符?

linux - 在第一个匹配项之前插入行的命令

如果其他字符串出现在 'n' 行之前,linux 替换字符串

macos - OSX 和 SED - 删除文档目录中第 25 行之后的所有行

ruby - 匹配与上一组匹配的相同数量的字符

javascript - 如何替换正则表达式中的变量

javascript - 替换 html 标签中以某些文本开头的制表符和换行符

regex - 在 R 统计中创建正则表达式

shell - 使用 SED 交换一行中出现的多个单词和数字