删除第二对方括号之间的文本,但不要删除第一对方括号

时间:2019-07-19 15:23:06

标签: bash sed

几行grepping和隐藏一组电话日志后,我最终得到的输出是这样的:

[2019-07-18 14:12:57] [1563477176.20446]  '30' <redacted> at 162+
[2019-07-18 14:14:08] [1563477248.20463]  '30' <redacted> at 162+
[2019-07-18 14:19:20] [1563477559.20468]  '30' <redacted> at 162+
[2019-07-18 23:30:41] [1563510638.21273]  '30' <redacted> at 162+
[2019-07-18 23:31:21] [1563510678.21276]  '30' <redacted> at 162+

为了保密起见,我已经删除了电话号码。

在这里,我想删除第二组括号之间以及第二对括号本身之间的乱码。它对应于该呼叫的唯一呼叫ID,并且在我喜欢的日志中(这是从我编写的自定义日志记录解决方案中提取的),但是在此视图中,我不需要它。我想简明扼要,只显示时间戳和数字。

我找到了一条相关的SE帖子,内容涉及如何删除sed中的括号之间的文本:https://unix.stackexchange.com/questions/14838/sed-one-liner-to-delete-everything-between-a-pair-of-brackets

sed中的一线是sed -e 's/\[[^][]*\]//g'

但是,看起来这会删除所有括号之间的文本,这不是我想要的。

有什么方法可以使其跳过每行第一组括号的内容吗?

由于我知道时间戳括号将始终是相同的长度,而第二组括号可以是可变长度的,因为小数点后的部分可以是任意数字,所以我考虑使用${line:0:21}将时间戳存储在temp变量中,然后运行sed语句,然后将两者串联在一起。但是我在bash中作为语句的一部分来执行此操作,该语句已经一个接十个,所以我不知道这样是否可行。无论哪种方式,听起来都像是不好的编码习惯。

是否可以跳过第一个[],还是必须将每一行分开才能在相关部分使用sed?

1 个答案:

答案 0 :(得分:3)

Sed的s命令将一个数字作为标志来指示应将替换应用于哪个匹配项,因此可以使用{{1}来代替g(所有匹配项) }:

2

您也不需要在括号表达式中使用sed 's/\[[^]]*\]//2' ,除非您期望嵌套的括号(示例输入没有)。


参考文献: