几行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?
答案 0 :(得分:3)
Sed的s
命令将一个数字作为标志来指示应将替换应用于哪个匹配项,因此可以使用{{1}来代替g
(所有匹配项) }:
2
您也不需要在括号表达式中使用sed 's/\[[^]]*\]//2'
,除非您期望嵌套的括号(示例输入没有)。
参考文献: