将 grep 输出放在另一行的末尾到另一个文件中
Posted
技术标签:
【中文标题】将 grep 输出放在另一行的末尾到另一个文件中【英文标题】:put grep output at the end of another line into another file 【发布时间】:2022-01-14 12:46:50 【问题描述】:我有一个列表,其中包含这样的电影名称
Film Name - Film.information.lanugage.2160p.more.info
Film Name - Film.info.information.1080p.more.info
Film Name - Film.information.lanugage.1080p.information.info
Film Name - Film.information.more.720p.more.info
Film Name - Film.more.lanugage.2160p.more.info
我正在使用grep '[0-9][0-9][0-9][0-9]p' list.txt > resolution.txt
过滤分辨率。我将搜索一个 sed cmd 来删除 -
之后的所有内容
我觉得应该是这个样子
sed 's/-.*$//g' list.txt > cleanList.txt
之后,我想将 resolution.txt 中的分辨率添加到 cleanList.txt 的行尾
最终的文件应该是这样的
Film Name 2160p
Film Name 1080p
Film Name 1080p
Film Name 720p
Film Name 2160p
【问题讨论】:
【参考方案1】:你可以使用
sed -E 's/(.*) - (.*[^0-9])?((480|720|1080|1440|2160|4320)p?)([^0-9].*)?/\1 \3/' list.txt > output.txt
详情:
(.*)
- 将尽可能多的字符匹配并捕获到第 1 组中
-
- 空格 + -
+ 空格
(.*[^0-9])?
- 第 2 组(可选):任何文本,然后是非数字字符
((480|720|1080|1440|2160|4320)p?)
- 第 3 组:任何常用分辨率值(在第 4 组中),然后是可选的 p
([^0-9].*)?
- 第 5 组(可选):一个非数字字符,然后是任何文本。
\1 \2
替换将匹配的行替换为第 1 组 + 空格 + 第 2 组值。
见online demo:
#!/bin/bash
s='Film Name - Film.information.lanugage.2160p.more.info
Film Name - name name - Film.info.information.1080p.more.info
Star Wars - Episode V - Das Imperium schlägt zurück - Star.Wars.Episode.V.Das.Imperium.schlaegt.zurueck.1980.German.DL.2160p.UHD.BluRay.x265-ENDSTATiON
Film Name - Film.information.lanugage.1080p.information.info
Film Name - asfasfaf - Film.information.more.720p.more.info
Film Name - Film.more.lanugage.2160p.more.info
Boss Baby - Schluss mit Kindergarten - pso-bossbaby2_bd.1080p
Sicario 2 - encounters-si2so_1080p
Skyscraper - encounters-skyscraper_1080p
Unsere Zeit ist jetzt - roor-unserezeit-1080p
Schindlers Liste - d-schindlersliste-1080p
South Park: Der Film – größer, länger, ungeschnitten - in-southpark1080p
Ein Hund namens Palma - rf-ehnp2021.1080
Taxi Driver (1976) - d-taxidriver-1080p
The Taking of Deborah Logan - The.Taking.of.Deborah.Logan.2014.LIMITED.1080p.BluRay.X264-CADAVER
Die Feuerzangenbowle 1944 - d-feuerzangenbowle-1080p
Hooligans - rsg-hooligans-1080p
Geständnisse - Confessions - wombat-gestaendnisse-1080p
Greyhound - greyhound.2020.german.dl.1080p.web.h264-wayne'
sed -E 's/(.*) - (.*[^0-9])?((480|720|1080|1440|2160|4320)p?)([^0-9].*)?/\1 \3/' <<< "$s"
输出:
Film Name 2160p
Film Name - name name 1080p
Star Wars - Episode V - Das Imperium schlägt zurück 2160p
Film Name 1080p
Film Name - asfasfaf 720p
Film Name 2160p
Boss Baby - Schluss mit Kindergarten 1080p
Sicario 2 1080p
Skyscraper 1080p
Unsere Zeit ist jetzt 1080p
Schindlers Liste 1080p
South Park: Der Film – größer, länger, ungeschnitten 1080p
Ein Hund namens Palma 1080
Taxi Driver (1976) 1080p
The Taking of Deborah Logan 1080p
Die Feuerzangenbowle 1944 1080p
Hooligans 1080p
Geständnisse - Confessions 1080p
Greyhound 1080p
【讨论】:
嘿,也谢谢你的解决方案。但我还有一个问题。有时电影名称包含一个额外的“-”。解决这个问题的最佳方法是什么? @FakeCake 您是否使用其中任何一个测试过这个解决方案?它会起作用的。 嗯,有时它有效有时它不起作用ideone.com/Xgxv9Y @FakeCake 好的,所以分辨率之前的点可以是任何非字母数字,对吧?哦,我看到p
可能不见了。
有时分辨率不除以非字母数字。是的,我也注意到 p 丢失了,但不介意。我会整理出来的。【参考方案2】:
我建议您使用awk
,它可以一次性为您提供更清洁的解决方案,而不是使用grep
和sed
。
试试:
awk -F" - " 'match($2, "[0-9]+p"); print $1, substr ($2, RSTART, RLENGTH)' list.txt > cleanList.txt
我使用字符串" - "
作为每个输入行上$1
和$2
之间的字段分隔符。
函数match()
查找与$2
内的字母p
后跟的数字相对应的正则表达式。此函数设置变量RSTART
和RLENGTH
以适合函数substr()
提取匹配模式并打印出来。
【讨论】:
您好,谢谢您的建议。工作完美,有一个例外。一些电影名称包含第二个“-”。我如何只删除最后一个和过去的所有内容? @FakeCake:这是一个不同的问题。我建议您将其作为一个新问题发布。【参考方案3】:您可以使用管道“|”操作数将一个命令的输出作为第二个命令的输入传递。 例如:
grep '[0-9][0-9][0-9][0-9]p' list.txt | sed 's/-.*$//g' list.txt > cleanList.txt
如果您想将第一个的输出保存到一个文件并使用第二个处理它,您应该使用命令 tee (tree) 将相同的输出写入两个文件。 例子: grep '...' list.txt |三通决议.txt | sed '...' > cleanList.txt
见: https://www.geeksforgeeks.org/tee-command-linux-example/ How to redirect output to a file and stdout How does a pipe work in Linux?
【讨论】:
以上是关于将 grep 输出放在另一行的末尾到另一个文件中的主要内容,如果未能解决你的问题,请参考以下文章
使用java的输入,输出流将一个文本文件的内容按行读出,每读一行就顺序添加行号,并写入到另一个文件