Grep命令问题-程序输出中的Grep文本?

如何解决Grep命令问题-程序输出中的Grep文本?

我正在尝试从json文件youtube-dl中提取信息,并将其中的一些信息grep到.txt文件中。

下载视频时youtube-dl的输出示例。

[info] Writing video description to: /Users/ACCOUNT/Downloads/Rick Astley - Never Gonna Give You Up (Video).description
[info] Writing video description metadata as JSON to: /Users/ACCOUNT/Downloads/Rick Astley - Never Gonna Give You Up (Video).info.json

我的想法

  1. Grep .json和.description文件路径,以在以后的grep命令中使用。
  2. 运行以下脚本的工作版本,并将新文本添加到.description文件中的描述文本上方。
  3. (将.description重命名为.txt)

我更喜欢这种方法,因为youtube-dl仅需要运行一次。

如果在Mac和Linux上还有其他通用命令可以像grep一样简单,那么我认为使用它们代替grep没问题。


问题

  • 如何grep文件路径并在脚本示例中下文所述的其他命令中使用它?
  • 如何运行以下脚本,但如何在该文本文件中的当前描述文本上方添加所有信息?
  • 当它从json文件中获取信息时,它也会在前后获得“”。因此,视频名称变为:"VIDEO NAME",但只希望它VIDEO NAME
  • 如何从json文件中复制标签?标签在.json文件:"tags": ["music","video","classic"]中看起来像这样。想要获得"music","classic"

脚本示例

    txtfile="$GREP_DESCRIPTION_FROM_YOUTUBE-DL_OUTPUT"
    jsonfile="$GREP_JSON_FROM_YOUTUBE-DL_OUTPUT"

    echo TITLE >> $txtfile
    grep -o '"title": *"[^"]*"' $jsonfile | grep -o '"[^"]*"$' >> $txtfile
    echo \ >> $txtfile
    
    echo CHANNEL >> $txtfile
    grep -o '"uploader": *"[^"]*"' $jsonfile | grep -o '"[^"]*"$' >> $txtfile
    echo \ >> $txtfile
    
    echo CHANNEL URL >> $txtfile
    grep -o '"uploader_url": *"[^"]*"' $jsonfile | grep -o '"[^"]*"$' >> $txtfile
    echo \ >> $txtfile
    
    echo UPLOAD DATE >> $txtfile
    grep -o '"upload_date": *"[^"]*"' $jsonfile | grep -o '"[^"]*"$' >> $txtfile
    echo \ >> $txtfile
    
    echo TAGS >> $txtfile
    grep -o '"tags": *"[^"]*"' $jsonfile | grep -o '"[^"]*"$' >> $txtfile
    echo \ >> $txtfile
    
    echo URL >> $txtfile
    echo $url >> $txtfile
    echo \ >> $txtfile
    
    echo DESCRIPTION >> $txtfile

解决方法

谢谢巴默!这回答了我四个问题中的三个。

剩下来的,我想不通的是如何从youtube-dl输出中获取json文件的位置,如何使其在脚本中工作以及如何在同一目录中以.txt结尾的.txt文件。 / p>

类似这样的东西:

  1. Grep [info] Writing video description metadata as JSON to: 之后的所有内容,即/Users/ACCOUNT/Downloads/Rick Astley - Never Gonna Give You Up (Video).info.json
  2. 设为$jsonfile
  3. 从点1获得相同的输出,将扩展名(最后一个.DOT之后的所有内容)替换为.txt,使$txtfile

使用jq更新脚本

#! /bin/bash

    txtfile="textfile.txt"
    jsonfile="jsonfile.json"

    echo - TITLE - >> $txtfile
    jq -r '.title' $jsonfile >> $txtfile
    echo \ >> $txtfile | echo \ >> $txtfile
    
    echo - CHANNEL - >> $txtfile
    jq -r '.uploader' $jsonfile >> $txtfile
    echo \ >> $txtfile | echo \ >> $txtfile
    
    echo - CHANNEL URL - >> $txtfile
    jq -r '.uploader_url' $jsonfile >> $txtfile
    echo \ >> $txtfile | echo \ >> $txtfile
    
    echo - UPLOAD DATE - >> $txtfile
    jq -r '.upload_date' $jsonfile >> $txtfile
    echo \ >> $txtfile | echo \ >> $txtfile
    
    echo - URL - >> $txtfile
    jq -r '.webpage_url' $jsonfile >> $txtfile
    echo \ >> $txtfile | echo \ >> $txtfile
    
    echo - TAGS - >> $txtfile
    jq -r -c '.tags' $jsonfile >> $txtfile
    echo \ >> $txtfile | echo \ >> $txtfile
    
    echo - DESCRIPTION - >> $txtfile
    jq -r '.description' $jsonfile >> $txtfile
,
youtube-dl --help | grep "dump-json"
    -j,--dump-json                  Simulate,quiet but print JSON information.

使用此选项,完全不需要下载视频。只需将youtube-dl的输出传递到适当的JSON解析器即可。我会推荐

youtube-dl -j https://www.youtube.com/watch?v=dQw4w9WgXcQ | xidel - -se '
  $json/(
    "- TITLE -",title,"","- CHANNEL -",uploader,"- CHANNEL URL -",uploader_url,"- UPLOAD DATE -",upload_date,"- URL -",webpage_url,"- TAGS -",substring-before(
      substring(serialize-json(tags),2),"]"
    ),"- DESCRIPTION -",description
  )
'

如果您已经下载了视频和JSON(我假设使用--write-info-json,则可以使用--get-filename检索文件名:

youtube-dl --get-filename https://www.youtube.com/watch?v=dQw4w9WgXcQ
Rick Astley - Never Gonna Give You Up (Video)-dQw4w9WgXcQ.mp4

jsonfile=$(youtube-dl --get-filename https://www.youtube.com/watch?v=dQw4w9WgXcQ)

xidel -s "${jsonfile/.mp4/.info}.json" -e '
  $json/(
    [...]
  )
' > "${jsonfile/.mp4/.info}.txt"

命令输出或“ 里克·阿斯特利-永远不会放弃你(视频)-dQw4w9WgXcQ.info.txt ”的内容:

- TITLE -
Rick Astley - Never Gonna Give You Up (Video)

- CHANNEL -
RickAstleyVEVO

- CHANNEL URL -
http://www.youtube.com/user/RickAstleyVEVO

- UPLOAD DATE -
20091024

- URL -
https://www.youtube.com/watch?v=dQw4w9WgXcQ

- TAGS -
"the boys soundtrack","the boys amazon prime","Never gonna give you up the boys","RickAstleyvevo","vevo","official","Rick Roll","video","music video","Rick Astley album","rick astley official","single","album","together forever","Never Gonna Give You Up","Whenever You Need Somebody","pop","rickrolled","WRECK-IT RALPH 2","Fortnite song Fortnite item shop Fortnite time shop today Fortnite montage","Fortnite event","Fortnite dance","fortnite never gonna give you up"

- DESCRIPTION -
Rick Astley's official music video for "Never Gonna Give You Up" Listen to Rick Astley: https://RickAstley.lnk.to/_listenYD Subscribe to the official Rick As...

实际上,如果您只需要这些信息,就不需要youtube-dl。解析html-source就足够了。

xidel -s https://www.youtube.com/watch?v=dQw4w9WgXcQ -e '
  "- TITLE -",//meta[@itemprop="name"]/@content,//span[@itemprop="author"]/link/@content,//span[@itemprop="author"]/link/@href,//meta[@itemprop="datePublished"]/@content,//meta[@property="og:url"]/@content,join(
    //meta[@property="og:video:tag"]/outer-html() ! substring-before(
      substring-after(.,"content="),">"
    ),","
  ),//meta[@itemprop="description"]/@content
'

html源还具有一个庞大的JSON,其中包含您需要的所有信息。提取起来有点困难,但是可以做到。与其他两种解决方案相比,此“源”没有截断的视频描述:

xidel -s https://www.youtube.com/watch?v=dQw4w9WgXcQ -e '
  let $json:=json(
        //script/extract(.,"ytplayer.config = (.+?\});",1)[.]
      )/args,$a:=json($json/player_response)/videoDetails,$b:=json($json/player_response)/microformat
  return (
    "- TITLE -",$a/title,$a/author,$b//ownerProfileUrl,$b//publishDate,$json/loaderUrl,substring-before(
      substring(serialize-json($a/keywords),$a/shortDescription
  )
'
,

下面讨论的已解决问题。

通过在脚本末尾添加两个“”来解决该问题

...
' --printed-json-format=compact >> "$textfile"

谢谢雷诺!


谢谢。现在已经尝试使其工作。它给了我一些错误,并开始了一些故障排除。还是没有运气。

此测试以查看是否有效。 folderurl出现在脚本的前面,并且是临时的。

    folder=/Users/ACCOUNT/Downloads/ytdl/
    url=https://www.youtube.com/watch?v=dQw4w9WgXcQ
    textfile=$(youtube-dl --get-filename -o $folder'%(title)s/%(title)s.txt' $url)
    $textfile

输出为:

-bash: /Users/ACCOUNT/Downloads/ytdl/Rick: No such file or directory

如果我创建该文件夹,则输出为

-bash: /Users/ACCOUNT/Downloads/ytdl/Rick: is a directory

但是如果我完全按照我的想法测试脚本

youtube-dl --get-filename -o /Users/ACCOUNT/Downloads/ytdl/'%(title)s/%(title)s.txt' https://www.youtube.com/watch?v=dQw4w9WgXcQ

输出为:

/Users/ACCOUNT/Downloads/ytdl/Rick Astley - Never Gonna Give You Up (Video)/Rick Astley - Never Gonna Give You Up (Video).txt

它应该是什么样子。我在做什么错了?


这是xidel脚本以及$url>> $textfile的更改方式。我使用此脚本是因为它具有完整的描述。

xidel -s "$url" -e '
  let $json:=json(
        //script/extract(.,$a/keywords,$a/shortDescription
  )
' --printed-json-format=compact >> $textfile

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-