将 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,它可以一次性为您提供更清洁的解决方案,而不是使用grepsed

试试:

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

我使用字符串" - " 作为每个输入行上$1$2 之间的字段分隔符。

函数match() 查找与$2 内的字母p 后跟的数字相对应的正则表达式。此函数设置变量RSTARTRLENGTH 以适合函数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的输入,输出流将一个文本文件的内容按行读出,每读一行就顺序添加行号,并写入到另一个文件

用于字符串的 grep 文件并将目录复制到另一个目录

使用java的输入输出流将一个文本文件的内容按行读取,每读一行就顺序添加行号,并写入到另一个文件中

linux 怎么将一个会更新的日志不停输出到另一个文件?

linux把一个文件的内容复制到另一个文件的末尾

linux把一个文件的内容复制到另一个文件的末尾