我正在尝试清理一个文本文件。
我想删除前 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/