【问题标题】:Put text inside brackets at the start of line将文本放在行首的括号内
【发布时间】:2019-07-18 06:50:50
【问题描述】:

我有以下字符串:

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

我在文档中进行了搜索,但没有找到任何相关内容。

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

干杯。

【问题讨论】:

  • 为什么投反对票?我完全迷路了……
  • 我不是反对者,但一般来说,关于 stackoverflow 的问题应该包括您尝试过的代码,但不充分,以及您对遇到的问题的描述。没有代码的问题看起来像是请求免费咨询,这里的许多专家不喜欢这样。
  • 哦,我明白了。我搜索了 aprox 的答案。 1 小时,我没有发现任何东西...下次我会尝试提供更多信息:) @John1024

标签: linux shell unix sed command


【解决方案1】:

你可以使用 sed:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    相关资源
    最近更新 更多