regex - 删除字符串直到第一次出现右括号
问题描述
我有一个看起来像的文件:
[----------] 7 tests from RouteGenSetup
[ RUN ] RouteGenSetup.AcceptTATTest
[2021-03-08 22:55:53.937] [info] TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 2.1, rounds: LLLLLL, pattern: TR
[2021-03-08 22:55:53.937] [info] TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 5.1, rounds: LLLLLL, pattern: TR
[2021-03-08 22:55:53.937] [info] TimeSlotAssignmentTable::LogTATRow(Add): 6.1 -> 7.1, rounds: LLLLLL, pattern: TR
[ OK ] RouteGenSetup.AcceptTATTest (0 ms)
[ RUN ] RouteGenSetup.BlockLinksTest
[2021-03-08 22:55:53.937] [error] TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 2.1, rounds: LLLLLL, pattern: TR
[2021-03-08 22:55:53.938] [error] TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 5.1, rounds: LLLLLL, pattern: TR
我想摆脱日期和时间戳(例如,[2021-03-08 22:55:53.937]
)。为此,我尝试使用以下sed
命令:
sed -i '/^\[2021-/s/^.*\]\ //1' output.txt
但是,时间戳右侧的[info]
或括号也会被删除:[error]
[----------] 7 tests from RouteGenSetup
[ RUN ] RouteGenSetup.AcceptTATTest
TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 2.1, rounds: LLLLLL, pattern: TR
TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 5.1, rounds: LLLLLL, pattern: TR
TimeSlotAssignmentTable::LogTATRow(Add): 6.1 -> 7.1, rounds: LLLLLL, pattern: TR
[ OK ] RouteGenSetup.AcceptTATTest (0 ms)
[ RUN ] RouteGenSetup.BlockLinksTest
TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 2.1, rounds: LLLLLL, pattern: TR
TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 5.1, rounds: LLLLLL, pattern: TR
当我尝试
sed -i '/^\[2021/s/[^\]]*//' output.txt
第一个左括号删除而不是第一个右括号:
[----------] 7 tests from RouteGenSetup
[ RUN ] RouteGenSetup.AcceptTATTest
2021-03-08 22:55:53.937] [info] TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 2.1, rounds: LLLLLL, pattern: TR
2021-03-08 22:55:53.937] [info] TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 5.1, rounds: LLLLLL, pattern: TR
2021-03-08 22:55:53.937] [info] TimeSlotAssignmentTable::LogTATRow(Add): 6.1 -> 7.1, rounds: LLLLLL, pattern: TR
[ OK ] RouteGenSetup.AcceptTATTest (0 ms)
[ RUN ] RouteGenSetup.BlockLinksTest
2021-03-08 22:55:53.937] [error] TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 2.1, rounds: LLLLLL, pattern: TR
2021-03-08 22:55:53.938] [error] TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 5.1, rounds: LLLLLL, pattern: TR
并尝试
sed -i '/^\[2021/s/^[^\]]*\]//' output.txt
不产生任何变化。我不知道如何解决这个问题。我尝试了一些类似帖子中推荐的东西,但没有运气。
注意:这不是sed - Linux 中正则表达式方括号检测]
的重复,因为这里的问题有所不同:如果该行以某个前缀开头,则仅匹配字符串开头和第一个 + 空格之间的子字符串。
sed 在以特定模式开头的行中替换单词 using没有解释如何获取以特殊字符开头的行,然后从开始到第一个]
+ 空格匹配字符串。
解决方案
您可以使用
sed -i '/^\[2021-/s/^[^]]*] //' file
这里,
/^\[2021-/
- 查找以开头的行[2021-
s/^[^]]*] //
- 匹配任何零个或多个字符,而不是]
从字符串的开头到第一个字符]
,然后是空格,并删除这些匹配项(因为 RHS 为空)。
Note[^]]
是一个否定括号表达式,它匹配除 . 之外的任何字符]
。由于括号表达式不支持正则表达式转义序列,]
需要是括号表达式中的第一个字符,因此不能\]
在括号表达式中使用 anwhere。
查看在线演示:
s='[----------] 7 tests from RouteGenSetup
[ RUN ] RouteGenSetup.AcceptTATTest
[2021-03-08 22:55:53.937] [info] TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 2.1, rounds: LLLLLL, pattern: TR
[2021-03-08 22:55:53.937] [info] TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 5.1, rounds: LLLLLL, pattern: TR
[2021-03-08 22:55:53.937] [info] TimeSlotAssignmentTable::LogTATRow(Add): 6.1 -> 7.1, rounds: LLLLLL, pattern: TR
[ OK ] RouteGenSetup.AcceptTATTest (0 ms)
[ RUN ] RouteGenSetup.BlockLinksTest
[2021-03-08 22:55:53.937] [error] TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 2.1, rounds: LLLLLL, pattern: TR
[2021-03-08 22:55:53.938] [error] TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 5.1, rounds: LLLLLL, pattern: TR'
sed '/^\[2021-/s/^[^]]*] //' <<< "$s"
输出:
[----------] 7 tests from RouteGenSetup
[ RUN ] RouteGenSetup.AcceptTATTest
[info] TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 2.1, rounds: LLLLLL, pattern: TR
[info] TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 5.1, rounds: LLLLLL, pattern: TR
[info] TimeSlotAssignmentTable::LogTATRow(Add): 6.1 -> 7.1, rounds: LLLLLL, pattern: TR
[ OK ] RouteGenSetup.AcceptTATTest (0 ms)
[ RUN ] RouteGenSetup.BlockLinksTest
[error] TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 2.1, rounds: LLLLLL, pattern: TR
[error] TimeSlotAssignmentTable::LogTATRow(Add): 1.1 -> 5.1, rounds: LLLLLL, pattern: TR
推荐阅读
- twilio - 使用 Twilio API 拨打电话时如何收集用户输入?
- swift - 如何制作一个采用 Binding 并将其传递给视图中的另一个 Binding 的视图 - SwiftUI
- java - 部署有效,JPA 有效,JawsDB 有效,但它们不能一起工作
- inno-setup - 为什么在 Inno Setup 中会多次调用 ShouldShipPage 函数
- reactjs - 切换时如何隐藏/显示图像?
- python - pyright:在具有最小值/最大值的同质列表中使用 TypeVar
- r - 然后在函数中用作 df 的反应性 CSV 选择
- java - 无法跨越和左对齐 GridBagLayout 中的文本字段
- perl - perl 指针数组引用的取消引用
- java - 为什么正则表达式提取在scala中返回错误的值