【问题标题】:Swapping words between others words and numbers in a line using sed使用 sed 在一行中的其他单词和数字之间交换单词
【发布时间】:2019-09-18 08:32:24
【问题描述】:

我正在尝试交换单词和数字之间出现的单词: 我有大文件,行有这个顺序,但数字不同,但单词“WORD,AGAIN,PIC”不会改变。

23  TWO-ONE2         WORD  5 AGAIN CIP D(89).           1234541120

我想要的输出应该是:

23 TWO-ONE2 CIP D(89) WORD 5 AGAIN. 1234541120

CIP "D(89) " 附近的值,可以改成 F7(934) 或类似的值,但在 () 中总是一个数字。

我试过命令:

sed -r 's/(WORD[0-9]+) (AGAIN+) (CIP[A-Z][0-9]([A-Z][0-9])+)/\3 \1 \2/'

sed -E 's/^(WORD.+AGAIN).+(CIP \+)/\2 \1/'

我将不胜感激!

【问题讨论】:

  • sed -E 's/(WORD +[0-9]+ +AGAIN)( +)(PIC +[A-Z]\([0-9]+\))/\3\2\1/'?
  • 感谢您的回复。输出没有改变
  • 我不知道为什么它不工作,可能是因为给定的空间? @WiktorStribiżew
  • 尝试用[[:space:]]+替换空格+
  • sed 's/\(WORD.*AGAIN\) *\(CIP *[^ ]*\)\./\2 \1\./' 怎么样?

标签: shell sed scripting


【解决方案1】:

您可以使用这个基于 POSIX ERE 的 sed:

sed -E 's/(WORD.*AGAIN)([^[:alnum:]]+)(CIP[^(]*\([0-9]+\))/\3\2\1/g' file > newfile

regex demo

详情

  • (WORD.*AGAIN) - 第 1 组 (\1):WORD,任何 0+ 个字符,AGAIN
  • ([^[:alnum:]]+) - 第 2 组 (\2):一个或多个除字母数字字符以外的字符
  • (CIP[^(]*\([0-9]+\)) - 第 3 组 (\3):CIP,除 (( 之外的 0 个或多个字符、1+ 个数字,然后是 )

【讨论】:

  • 它的工作原理非常感谢你!!!我能问你一些除此之外但与这个命令有关的事情吗?
  • 你应该马上问:)
  • 只是想先问一下:)。我需要在行的开头添加 cmets,只要在此 sed 命令之后进行了“更改”之类的更改。我该如何改变呢?谢谢
  • 使用sed -E 's/(.*)(WORD.*AGAIN)([^[:alnum:]]+)(CIP[^(]*\([0-9]+\))/changed \1\4\3\2/'。看起来g 标志在这里并不是真正需要的,因为您似乎需要每行执行一次正则表达式替换。
猜你喜欢
  • 2019-09-15
  • 2015-11-19
  • 2016-11-24
  • 1970-01-01
  • 2021-12-31
  • 2019-10-27
  • 2013-03-21
  • 2019-09-20
  • 1970-01-01
相关资源
最近更新 更多