我正在尝试清除列表文件中的文本。这是一个示例:
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
似乎没有任何作用。
在线文件名输出是否正确?
答案 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