首页 > 解决方案 > 将文本放在行首的括号内

问题描述

我有以下文本字符串:

185.244.25.157 [10 Feb @ 12:53:52] "GET login.cgi HTTP/1.1" 400 0

是的,那是一个试图破坏我的系统的恶意机器人,但这不是重要的事情。

我希望方括号之间的文本(我的意思是那些: [ ] )位于字符串的开头。这会给我以下输出:

[10 Feb @ 12:53:52] 185.244.25.157 "GET login.cgi HTTP/1.1" 400 0

我在文档中进行了搜索,但没有找到任何有关它的信息。

谁能告诉我应该在哪里搜索?

干杯。

标签: linuxshellunixsedcommand

解决方案


您可以使用 sed:

sed 's/\(.*\)\(\[[^]]*\] \)/\2\1/' file.in > file.out
  • s/PATTERN/REPLACEMENT/是一个替换,它用替换替换所有匹配模式的东西。某些字符在模式中具有特殊含义:
  • .匹配任何字符
  • *表示“重复 0 次或更多次”,因此.*匹配任意数量的任意字符
  • \(...\)是捕获括号,保存与它们内部匹配的内容(第一个捕获到\1,第二个到\2等)
  • [...]引入一个字符类,它匹配方括号内的任何字符
  • ^是字符类中的否定,因此[^]]匹配除 之外的任何字符],并[^]]*匹配除]
  • \[匹配文字[,类似地\]

所以,第一个之前的[存储到\1,后面的从[到第一个]的字符存储在\2,这两部分被替换\2\1,即它们的顺序是相反的。


推荐阅读