将另一行末尾的 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,它可以一次性提供更清晰的解决方案,而不是使用 grepsed

尝试:

awk -F" - " '{match(, "[0-9]+p"); print , substr (, RSTART, RLENGTH)}' list.txt > cleanList.txt

我在每个输入行上使用字符串 " - " 作为 </code> 和 <code> 之间的字段分隔符。

函数 match() 查找一些正则表达式,这些正则表达式对应于 </code> 中紧跟字母 <code>p 的数字。此函数以适合函数 substr() 的方式设置变量 RSTARTRLENGTH 以提取匹配模式并打印它。

您可以使用

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 值。

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].*)?/ /' <<< "$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