【问题标题】:How to modify this sed awk command so that the output goes to a file of choice?如何修改此 sed awk 命令以使输出转到选择的文件?
【发布时间】:2020-04-02 06:30:37
【问题描述】:

我正在使用此 SO 答案 https://stackoverflow.com/a/54818581/80353 中的最后一个命令

cap()(cd /tmp;rm -f *.vtt;youtube-dl --skip-download --write-auto-sub "$1";sed '1,/^$/d' *.vtt|sed 's/<[^>]*>//g'|awk -F. 'NR%8==1{printf"%s ",$1}NR%8==3'|tee cap)

这个命令当前做什么

  1. 此命令会将 youtube 视频的字幕下载为 .vtt 文件和
  2. 然后在终端上打印出.vtt文件的简化版

此命令按描述工作。

如何使用这个命令

在终端中我会运行一次上面的命令,然后运行cap $youtube_url

我喜欢什么

我想修改原来的cap()函数,让原来的行为保留一个额外的部分

  1. 此命令会将 youtube 视频的字幕下载为 .vtt 文件(未更改)
  2. 然后将 .vtt 文件的简化版本打印到另一个文件中,该文件声明为参数 $2(已更改)

我希望如何调用新命令

最初,我将原始命令称为

cap $youtube_url

现在我喜欢这样做

cap $youtube_url $relative_or_absolute_path_of_text_or_markdown_file

如何修改原来的 cap 命令来达到我想要的结果?

【问题讨论】:

  • 能否请您告诉我们您的代码的完整要求,因为这看起来很复杂,可能会导致混淆。请在您的问题中添加更多信息,然后让我们知道,干杯。
  • @RavinderSingh13 哦,我不知道这还不够清楚。让我再尝试一次。这样更好吗?
  • 你试过... | tee "$2"而不是... | tee cap吗?
  • @KimStacks,您可以尝试关注一次cap()(cd /tmp;rm -f *.vtt;youtube-dl --skip-download --write-auto-sub "$1";sed '1,/^$/d' *.vtt|sed 's/&lt;[^&gt;]*&gt;//g'|awk -F. 'NR%8==1{printf"%s ",$1}NR%8==3'|tee -a "$2") 吗?然后让我知道。这应该在屏幕上显示输出并保存到输出文件中。

标签: awk sed terminal youtube


【解决方案1】:

谢谢 @KimStacks @RavinderSingh13 @Oguz-Ismail 在上面和之前的post 中发布这些解决方案@

我设法在 .vtt 文件中使用youtube-dl --skip-download --write-auto-sub $youtube_url

获得结果

但是,输出的格式并不适合我的目的。我必须逐行删除才能删除时间以及/n 新行。所以我想自定义代码语法以满足我的要求。

注意:不确定是否是新查询,所以我现在将其发布在这里:

  1. 我已经尝试了之前post和这里建议的所有步骤,但我仍然无法理解:
  • 如何在下面的代码中插入“$youtube_url”?

    cap()(cd /tmp;rm -f *.vtt;youtube-dl --skip-download --write-auto-sub "$1";\
    sed '1,/^$/d' *.vtt|sed 's/<[^>]*>//g'|awk -F. 'NR%8==1{printf"%s ",$1}NR%8==3'\
    |tee -a "$2")
    
  1. 我尝试在两端编辑'NR%8==1{printf"%s ",$1}NR%8==3' 中从0 到3 到-1 的数字,但没有成功在.vtt 文件中获得正确的格式。因此,是否有可能:
  • 转录文本连续打印为句子,而不是每个字幕都打印为换行符?

  • 删除开始时间的打印输出?

【讨论】:

  • 我不会对此投反对票,所以请考虑我在之前的评论中写的内容并做出相应的更改。希望您在接下来的几天内做出适当的更改
【解决方案2】:

这里有一个详细的 bash 脚本,供那些想要使用相对路径保存 subs 文件的人使用。

结果保存为明文,去掉时间、换行和其他标记。

#!/bin/bash
# video-cap.sh videoUrl sub.txt

# Download captions only and save in a .vtt file
youtube-dl --skip-download --write-auto-sub "$1";

# Find .vtt files in current directory created within last 3 seconds, limit to 1
vtt=$(find . -cmin -0.05 -name "*.vtt" | head -1)

# Extract the subs and save as plaintext, removing time, new lines and other markup
sed '1,/^$/d' "$vtt" \
  | sed 's/<[^>]*>//g' \
  | awk -F. 'NR%8==1{$1}NR%8==3' \
  | tr '\n' ' ' > "$2"

# Remove the original .vtt subs file
rm -f "$vtt"

【讨论】:

    【解决方案3】:

    考虑到您想在屏幕上看到输出,并且还想将输出保存到输出文件中,如果是这种情况,请尝试以下操作。

    cap()(cd /tmp;rm -f *.vtt;youtube-dl --skip-download --write-auto-sub "$1";sed '1,/^$/d' *.vtt|sed 's/<[^>]*>//g'|awk -F. 'NR%8==1{printf"%s ",$1}NR%8==3'|tee -a "$2")
    

    或以非单行形式使用:

    cap()(cd /tmp;rm -f *.vtt;youtube-dl --skip-download --write-auto-sub "$1";\
    sed '1,/^$/d' *.vtt|sed 's/<[^>]*>//g'|awk -F. 'NR%8==1{printf"%s ",$1}NR%8==3'\
    |tee -a "$2")
    

    请确保您在变量中提供了完整的路径,例如--> relative_or_absolute_path_of_text_or_markdown_file="/full/path/output_file.txt" 等只是一个示例。我无法测试它,因为我的盒子里没有 vtt 文件等机制。

    如果您不想在屏幕上打印信息而只想将输出保存到输出文件中,那么@oguz ismail 的评论只使用tee "$2" 而不是tee -a "$2",如上所示。

    【讨论】:

    • 它有效。是的,我需要说明它的完整路径才能工作。不能使用相对路径。我有一个额外的请求,但想知道它是否应该是一个单独的问题。如果新文件不存在并且相对路径可以工作,我希望能够创建它。宁愿以正确的方式使用 SO。那么我应该作为新问题重新发布还是继续这个问题?非常感谢??
    • @KimStacks,欢迎您,恕我直言,看起来像是一个全新的查询,您可以为其创建一个新问题,干杯。
    猜你喜欢
    • 2020-04-03
    • 2019-03-19
    • 2013-01-17
    • 2015-12-26
    • 2015-03-19
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    相关资源
    最近更新 更多