我希望能够执行以下操作:

String1= "HELLO 3002_3322 3.2.1.log"

并获得如下输出:
output = "3002_3322 3.2.1.log HELLO"

我知道sed命令可以执行此操作,但是我需要一些指导。

谢谢!

最佳答案

在sed中,您可以执行以下操作:

sed 's/\([^[:blank:]]*\)[[:blank:]]*\(.*\)/\2 \1/'

输出3002_3322 3.2.1.log HELLO

说明
  • 第一个单词由捕获\([^[:blank:]]*\)\(\)表示我想捕获此组以供以后使用。 [:blank:]是用于空白字符的POSIX字符类。您可以在此处查看其他POSIX字符类:

  • http://www.regular-expressions.info/posixbrackets.html

    外部[]表示匹配任何字符,而^表示除字符类中列出的字符以外的任何字符。最后,*表示前一个字符的任何出现次数(包括0)。因此,总的[^[:blank:]]*意味着匹配一组非空格字符或第一个单词。我们必须执行这种稍微复杂的正则表达式,因为POSIX sed仅支持贪婪匹配的BRE(基本正则表达式),并找到我们想要非贪婪匹配的第一个单词。
  • [[:blank:]]*,如上所述,这意味着匹配一组连续的空格。
  • \(.*\)这意味着捕获行的其余部分。 .表示任何单个字符,因此与*结合使用意味着匹配其余字符。
  • 对于替换,\2 \1表示将我们匹配的模式替换为第二个捕获组,一个空格,然后是第一个捕获组。
  • 关于linux - 如何从字符串中剪切字符并将其放在末尾,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30610799/

    10-16 10:23
    查看更多