我希望能够执行以下操作:
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/