正则表达式和sed-删除文本文件中除文件名之外的所有内容

时间:2019-01-02 16:04:01

标签: regex bash

我正在尝试清除列表文件中的文本。这是一个示例:

15Tlb3Bsn5ec71Os6paEyTpf-5YkTsjwo   CNEWS-2018-12-01_07-00-00h.mp4             bin    1.5 GB     2018-12-03 16:03:00
1irhwA-tcExWXs-ksyOQuEBYL-LDktMQB   franceinfo-2018-12-01_06-30-00h.mp4        bin    949.2 MB   2018-12-03 18:43:10
1UEjtEtU27gMA-Bf7J1rTVhFn9D5z0Rjb   LCI-2018-12-01_06-00-00h.mp4               bin    908.2 MB   2018-12-03 17:30:11
1_ouEY6Ugg8h_XvzjE4j4m751o3eMNxhh   BFMTV-2018-12-01_05-30-00h.mp4             bin    1.2 GB     2018-12-03 14:33:25
1f7JWvb6PM9PRhFimXKc8k81qiTVKwe-e   franceinfo-2018-12-01_04-30-00h.mp4        bin    1.0 GB     2018-12-03 18:43:36
1nKzPZw6tKNzErmWdwbq8f-47DSF4cQbt   BFMTV-2018-12-01_03-30-00h.mp4             bin    1.2 GB     2018-12-03 14:33:03

所以我认为此表达式可能有效:

([A-z])*(-)(\d{4})(-)(\d{2})(-)(\d{2})_(\d{2})-(\d{2})-(\d{2}h)(\.)(mp4)

但是我尝试了很多sed命令,例如:

sed -n -E 's/([A-z])*(-)(\d{4})(-)(\d{2})(-)(\d{2})_(\d{2})-(\d{2})-(\d{2}h)(\.)(mp4)/\2/p' /media/partage/v2/backupGdriveListOnline.txt

似乎没有任何作用。

在线文件名输出是否正确?

1 个答案:

答案 0 :(得分:1)

sed不支持某些正则表达式功能。
尝试grep

grep -ioP '([A-Z])*(-)(\d{4})(-)(\d{2})(-)(\d{2})_(\d{2})-(\d{2})-(\d{2}h)(\.)(mp4)' text

输出:

CNEWS-2018-12-01_07-00-00h.mp4
franceinfo-2018-12-01_06-30-00h.mp4
LCI-2018-12-01_06-00-00h.mp4
BFMTV-2018-12-01_05-30-00h.mp4
franceinfo-2018-12-01_04-30-00h.mp4
BFMTV-2018-12-01_03-30-00h.mp4

您的正则表达式中也有错字,[A-z]应该是[A-Z]
-i--ignore-case忽略大小写区别
-o--only-matching仅显示匹配PATTERN
的行的一部分 -P--perl-regexp PATTERN是一个Perl正则表达式

我可以看到您为正则表达式付出了巨大的努力,因此我建议您这样做。

但是,除了awk简洁的print $2方式之外,您还可以使用sed真正clean进行其他操作:

sed -E 's/^[^ \t]*[ \t]+//;s/(\.mp4).*/\1/' text

从行首到空格(包括)中删除所有内容,
并删除.mp4

之后的所有内容