【问题标题】:sed remove specific key with varying value from stringsed 从字符串中删除具有不同值的特定键
【发布时间】:2020-09-24 20:41:39
【问题描述】:

假设我有一个字符串:

ap=test:::bc=exam:::dc=comic:::mp=calc:::

在linux盒子里读,我需要去掉bc=exam,key总是一样的,但是value可以是任意值,字符串或者数字,key-value对的位置可以在任意位置细绳。

我必须去

sed -e 's/:::bc=\(.*:::\)*/\1/'

只删除键和分隔符。

sed -e 's/:::bc=.*\(:::\)*/\1/'

这是从键上删除所有内容。

提前致谢。

【问题讨论】:

  • 当匹配他们的键值时,匹配直到 : 的任何东西怎么样?
  • sed 's/:::bc=[^:]*//' file (demo)?
  • 值可以包含冒号吗?
  • 值中没有分号。

标签: string sed trim


【解决方案1】:

由于您的值不包含分号,您可以将它们与否定括号表达式匹配,[^:]*

sed  's/:::bc=[^:]*//' file

请参阅online sed demo

:::bc=[^:]* 匹配 :::bc,然后匹配除冒号之外的任何 0+ 字符。

【讨论】:

  • 维克托。谢谢!效果很好。另一个问题是......如果分隔符使用需要转义的字符怎么办?例如^M。如果我用 ^M 替换分隔符,它将保留该值。
  • ap=test^Mbc^Mexam^Mdc=comic^Mmp=calc^M,它们不是回车,它们是,但是另一个应用程序会进行转换,我无法避免(旧的旧应用程序)
  • @cmct90025 看起来^M 用作分隔符和“等号”。如果值不能包含^ 字符,您可以使用类似的技巧:sed 's/\^Mbc\^M[^^]*//' file,请参阅demo。否则,您将需要多步骤方法,或使用 Perl,perl -pe 's/\^Mbc\^M.*?(?=\^M|$)//' file
猜你喜欢
  • 2012-03-21
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多