bash - 删除模式前的所有内容

标签 bash perl awk sed

我正在尝试清理一个文本文件。

我想删除前 12 个数字之前的所有内容。

1:0:135103079189:0:0:2:0::135103079189:000011:00
A:908529896240:0:10250:2:0:1:
603307102606:0:0:1:0::01000::M

期望的输出:

135103079189:0:0:2:0::135103079189:000011:00
908529896240:0:10250:2:0:1:
603307102606:0:0:1:0::01000::M

这是我的命令,但似乎不起作用。

sed '/:\([0-9]\{12\}\)/d' t.txt

最佳答案

sed 中的d 命令将删除匹配给定正则表达式的整行,您需要使用s 命令来搜索和替换行的一部分...但是,对于给定的问题,sed 不适合,因为它不支持非贪婪正则表达式

你可以改用perl

$ perl -pe's/^.*?(?=\d{12}:)//' ip.txt
135103079189:0:0:2:0::135103079189:000011:00
908529896240:0:10250:2:0:1:
603307102606:0:0:1:0::01000::M
  • .*? 尽可能少地匹配零个或多个字符
    • (?=\d{12}:) 仅当其后跟以 结尾的 12 位数字时:
  • 使用 perl -i -pe 进行就地编辑


一些可能的极端情况

$ # this is matching part of field
$ echo 'foo:123:abc135103079189:23:603307102606:1' | perl -pe's/^.*?(?=\d{12}:)//'
135103079189:23:603307102606:1
$ # this is not matching 12-digit field at end of line
$ echo 'foo:123:135103079189' | perl -pe's/^.*?(?=\d{12}:)//'
foo:123:135103079189

$ # so, add start/end of line matching cases and restrict 12-digits to whole field
$ echo 'foo:123:abc135103079189:23:603307102606:1' | perl -pe 's/^(?:.*?:)?(?=\d{12}(:|$))//'
603307102606:1
$ echo 'foo:123:135103079189' | perl -pe's/^(?:.*?:)?(?=\d{12}(:|$))//'
135103079189

关于bash - 删除模式前的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51806891/

相关文章:

Perl Dancer send_file 图像问题

xml - 使用 XML::Twig 处理巨大文件 (>10 GB) 的性能问题

regex - awk/sed 在两个模式之间插入行

linux - 如何从命令输出中删除空格/制表符

regex - 如何 grep 一个特定的模式

Linux bash - 输入格式

c - 如何在 gwan c 脚本中嵌入 perl 脚本?

c - 找不到 perl 命令

regex - 使用 Bash (sed?) 删除包含特定文本的多行/* ... */样式注释(正则表达式)

从 stdin 读取时,python 交互模式不起作用