【问题标题】:How to modify sed awk command to work with relative path如何修改 sed awk 命令以使用相对路径
【发布时间】:2020-04-03 04:42:29
【问题描述】:

上下文

我在https://stackoverflow.com/a/59244265/80353 成功回答了一个 SO 问题

我已经成功使用了给出的命令。

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. 此命令将从 $1 参数将 youtube 视频的字幕下载为 .vtt 文件
  2. 然后将 .vtt 文件的简化版本打印到另一个文件中,该文件被声明为参数 $2

这和宣传的一样。

如何调用命令

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

我想要什么改变

目前,$2 参数必须是完整路径。目前,如果 $2 参数不存在,将创建一个实际文件。我想要的是即使对于相对路径,这种行为仍然存在。所以希望对于相对路径,这种创建新空文件的行为仍然有效。

更新

我看到 cmets 是这样的,命令没有任何问题。

但是,我确实尝试过运行

cap $youtube_url $relative_path_to_a_text_file 在 macOS 中它绝对不适合我

也许我错过了其他东西?

更新 2

这是我运行 awk sed 命令的视频。首先,我只使用相对路径。当前工作目录中没有显示输出文件。第二个显示我输入完整路径并且它有效。

https://www.loom.com/share/1c179506fa5b48b4a3d62c81a9d2a411

我希望这可以澄清我提出的问题,并且评论者会根据此视频更新他们的 cmets。

【问题讨论】:

  • 在显示的代码中,第二个参数不必是完整路径。它只需要指定一个可以创建或附加的文件。您可以使用 elephant../pachyderms/elephantmammoths/frozen/elephant 并且只要目录 ../pachydermsmammoths/frozen 存在,$2 就可以正常工作(第一个使用当前目录 - 通常存在)。
  • 比较难修复没有损坏的东西...
  • @JonathanLeffler 我已经做了一个织机来澄清我的问题。希望这能说明为什么我认为 awk、sed 不适用于相对路径

标签: awk sed terminal


【解决方案1】:

编辑:在 OP 的评论之后添加一个解决方案,它会检查 OP 的函数本身,但警告没有测试它。

cap()(
user_path=$(echo "$path_details" | awk 'match($0,/.*\//){print substr($0,RSTART,RLENGTH)}')
path_details="$2"
PWD=`pwd`
cd "$PWD"
user_path=$(echo "$path_details" | awk 'match($0,/.*\//){print substr($0,RSTART,RLENGTH)}')
if [[ -d "$user_path" ]]
then
    echo "Present path $user_path."
    ##Call your program here....##
    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"
else
    echo "NOT present path $user_path."
    ##Can exit from here. if needed.##
fi
)


我相信 OP 想要检查作为第二个参数传递的相对路径的目录是否存在,如果是这种情况,那么可以尝试关注。

cat file.ksh
path_details="$2"
PWD=`pwd`
##Why I am going to your path is, in case you are running this from cron, so in that case you can mention complete path here, rather than pwd as mentioned above.
cd "$PWD"
user_path=$(echo "$path_details" | awk 'match($0,/.*\//){print substr($0,RSTART,RLENGTH)}')

if [[ -d "$user_path" ]]
then
    echo "Present path $user_path."
    ##Call your program here....##
else
    echo "NOT present path $user_path."
    ##Can exit from here. if needed.##
fi


说明:为上述代码添加详细说明。

cat file.ksh       ##For OP reference to show content I am using cat script_name here.
path_details="$2"  ##Creating variable path_details whose value is $2(2nd argument passed to script) 
PWD=`pwd`          ##Creating variable PWD whose value is pwd(current working directory).
##Why I am going to your path is, in case you are running this from cron, so in that case you can mention complete path here, rather than pwd as mentioned above.
cd "$PWD"          ##Going to current directory, why I did is you can set PWD above variable value as per your need and navigate to that path, this will help in case of script is running from Cron.
user_path=$(echo "$path_details" | awk 'match($0,/.*\//){print substr($0,RSTART,RLENGTH)}')  ##Now getting path details from passed 2nd argument for script.

if [[ -d "$user_path" ]]                        ##Checking if user_path(path value is existing on system)
then
    echo "Present path $user_path."
    ##Call your program here....##              ##If path existing then call your program.
else                                            ##If path NOT existing then exit from program or print message up to you :)
    echo "NOT present path $user_path."
    ##Can exit from here. if needed.##
fi                                              ##Closing if condition here.

【讨论】:

  • 对不起,我刚看到这个。我该如何运行?这是一个 bash 脚本吗?以前我只有一个 awk sed 命令,那么如何将其更改为您刚刚给我的命令?
  • @KimStacks,是的,它是一个 bash 脚本,无论我在哪里写 call your program,你都应该在那里调用你的代码并测试一次,然后让我知道?
  • 你能解释一下你的 bashscript 的第一行在做什么吗?非常感谢您的密切关注?
  • @KimStacks,当然,我已经在我的回答中添加了详细信息,如有任何疑问,请检查并告知。
  • 你很有帮助。比大多数人更有帮助。但这似乎有点过分使用 bashript 来调用 awk-sed 命令。此外,我对 awk-sed 命令的第一个参数是一个每次都可以不同的参数。这会传递到bashscript吗?原来的awk-sed命令真的没有办法修改吗?你看到我的织机视频了吗?我希望织机视频能澄清我的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
相关资源
最近更新 更多