【问题标题】:Moving substrings within string在字符串中移动子字符串
【发布时间】:2019-04-26 04:52:08
【问题描述】:

假设一个长字符串包含多个信息字段(子字符串),每个字段都括在方括号中。每个字段前面的几个字符是冒号字符。

目标是将方括号(加上方括号)中的所有字段移动到紧接在其前面的冒号字符。

$echo "foo: bar [baz] qux: quux [quix]" | sought_command
foo[baz]: bar qux[quix]: quux

我相信只有 awk 足够强大来实现这一点,但也许 sed 也可以做到这一点。

注意

这是使用 sed 的第一次尝试:

echo "foo: bar [baz] qux: quux [quix]" | sed 's/\[*]\/\:\1\2/g'

这是使用 awk 的第一次尝试:

echo "foo: bar [baz] qux: quux [quix]" | awk -v 'RS=\]' '{print substr($1,1,length($1)-1) $3 "]: " $2}'

【问题讨论】:

  • @kvantour 感谢您提醒我,但我的帖子还没有完成编辑。
  • @tripleee 目标是将所有出现的[any string] 移到紧接其前一个冒号之前。

标签: string text awk sed


【解决方案1】:

sed:

sed 's|\([^ :]*\):\([^:[]*\)\(\[[^]]*\]\)|\1\3:\2|g'

这实际上创建了 3 个组:

  1. \([^ :]*\): 任何不包含冒号并以冒号结尾的内容
  2. \([^:[]*\) 任何不包含冒号和左括号的内容。备注,你必须在左方括号前写冒号,因为[:] 在 sed 中有未定义的含义。
  3. \(\[[^]]*\]\) 方括号之间的任何内容。

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed):

    sed -r 's/:([^[]*)([^]]*\]) ?/\2:\1/g' file
    

    : 后面的符号的模式匹配并重新排列后面的引用。

    没有-r 选项的语法糖的相同解决方案:

    sed 's/:\([^[]*\)\([^]]*\]\) \?/\2:\1/g' file
    

    【讨论】:

      猜你喜欢
      • 2013-12-13
      • 2021-09-19
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 2022-11-02
      • 2022-01-13
      • 1970-01-01
      相关资源
      最近更新 更多