将另一行末尾的 grep 输出放入另一个文件
put grep output at the end of another line into another file
我得到了一个包含这样的电影名称的列表
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
您可以使用管道“|”操作数将一个命令的输出作为第二个命令的输入传递。
例如:
grep '[0-9][0-9][0-9][0-9]p' list.txt | sed 's/-.*$//g' list.txt > cleanList.txt
如果你想将第一个的输出保存到一个文件并用第二个处理它,你应该使用命令 tee (tree) 将相同的输出写入两个。
例子:
grep '...' list.txt |发球台 resolution.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?
我建议您使用 awk
,它可以一次性提供更清晰的解决方案,而不是使用 grep
和 sed
。
尝试:
awk -F" - " '{match(, "[0-9]+p"); print , substr (, RSTART, RLENGTH)}' list.txt > cleanList.txt
我在每个输入行上使用字符串 " - "
作为 </code> 和 <code>
之间的字段分隔符。
函数 match()
查找一些正则表达式,这些正则表达式对应于 </code> 中紧跟字母 <code>p
的数字。此函数以适合函数 substr()
的方式设置变量 RSTART
和 RLENGTH
以提取匹配模式并打印它。
您可以使用
sed -E 's/(.*) - (.*[^0-9])?((480|720|1080|1440|2160|4320)p?)([^0-9].*)?/ /' list.txt > output.txt
详情:
(.*)
- 匹配并捕获尽可能多的任何字符到第 1 组
-
- space + -
+ space
(.*[^0-9])?
- 第 2 组(可选):任何文本,然后是非数字字符
((480|720|1080|1440|2160|4320)p?)
- 第 3 组:任何常见的分辨率值(在第 4 组中),然后是可选的 p
([^0-9].*)?
- 第 5 组(可选):一个非数字字符,然后是任何文本。
替换将匹配的行替换为组 1 + space + 组 2 值。
#!/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].*)?/ /' <<< "$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
我得到了一个包含这样的电影名称的列表
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
您可以使用管道“|”操作数将一个命令的输出作为第二个命令的输入传递。 例如:
grep '[0-9][0-9][0-9][0-9]p' list.txt | sed 's/-.*$//g' list.txt > cleanList.txt
如果你想将第一个的输出保存到一个文件并用第二个处理它,你应该使用命令 tee (tree) 将相同的输出写入两个。 例子: grep '...' list.txt |发球台 resolution.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?
我建议您使用 awk
,它可以一次性提供更清晰的解决方案,而不是使用 grep
和 sed
。
尝试:
awk -F" - " '{match(, "[0-9]+p"); print , substr (, RSTART, RLENGTH)}' list.txt > cleanList.txt
我在每个输入行上使用字符串 " - "
作为 </code> 和 <code>
之间的字段分隔符。
函数 match()
查找一些正则表达式,这些正则表达式对应于 </code> 中紧跟字母 <code>p
的数字。此函数以适合函数 substr()
的方式设置变量 RSTART
和 RLENGTH
以提取匹配模式并打印它。
您可以使用
sed -E 's/(.*) - (.*[^0-9])?((480|720|1080|1440|2160|4320)p?)([^0-9].*)?/ /' list.txt > output.txt
详情:
(.*)
- 匹配并捕获尽可能多的任何字符到第 1 组-
- space +-
+ space(.*[^0-9])?
- 第 2 组(可选):任何文本,然后是非数字字符((480|720|1080|1440|2160|4320)p?)
- 第 3 组:任何常见的分辨率值(在第 4 组中),然后是可选的p
([^0-9].*)?
- 第 5 组(可选):一个非数字字符,然后是任何文本。
替换将匹配的行替换为组 1 + space + 组 2 值。
#!/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].*)?/ /' <<< "$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