小编Dan*_*uus的帖子

可能的竞争条件,来自多个发球台接收者的管道输出在BASH脚本中的命名管道上无序到达

更新:虽然没有真正解决我的管道工作中出现的原始问题,但我已经通过大大简化它解决了我的问题,并且完全抛弃了管道.这是一个概念验证脚本,可以在从磁盘,CRC32,MD5,SHA1,SHA224,SHA256,SHA384和SHA512校验和中读取一次并行生成,并将它们作为JSON对象返回(将在PHP中使用输出)和Ruby).这是原始的没有错误检查,但它的工作原理:

#!/bin/bash

checksums="`tee <"$1" \
        >( cfv -C -q -t sfv -f - - | tail -n 1 | sed -e 's/^.* \([a-fA-F0-9]\{8\}\)$/"crc32":"\1"/' ) \
        >( md5sum - | sed -e 's/^\([a-fA-F0-9]\{32\}\) .*$/"md5":"\1"/' ) \
        >( sha1sum - | sed -e 's/^\([a-fA-F0-9]\{40\}\) .*$/"sha1":"\1"/' ) \
        >( sha224sum - | sed -e 's/^\([a-fA-F0-9]\{56\}\) .*$/"sha224":"\1"/' ) \
        >( sha256sum - | sed -e 's/^\([a-fA-F0-9]\{64\}\) .*$/"sha256":"\1"/' ) \
        >( sha384sum - | sed -e 's/^\([a-fA-F0-9]\{96\}\) .*$/"sha384":"\1"/' ) \
        >( sha512sum - | sed …
Run Code Online (Sandbox Code Playgroud)

bash pipe race-condition conditional-statements

5
推荐指数
1
解决办法
1107
查看次数

BASH正则表达式匹配 - 包括括号中的括号中的括号以匹配?

我正在尝试做一个小小的bash脚本,它会清理我喜欢的一些电视节目下载剧集的文件和文件夹名称.它们通常看起来像"[www.Speed.Cd] - Some.Show.S07E14.720p.HDTV.X264-SOMEONE",我基本上只想剥去那个speedcd广告位.

使用BASH中的正则表达式匹配很容易删除www.Speed.Cd,空格和破折号,但对于我的生活,我无法弄清楚如何将括号包含在要匹配的字符列表中.[ - []不起作用,[ - \[],[ - \\ [],[ - \\\ []或我要删除的括号前面的任意数量的转义字符也不起作用.

这是我到目前为止所得到的:

[[ "$newfile" =~ ^(.*)([- \[]*(www\.torrenting\.com|spastikustv|www\.speed\.cd|moviesp2p\.com)[- \]]*)(.*)$ ]] &&
    newfile="${BASH_REMATCH[1]}${BASH_REMATCH[4]}"
Run Code Online (Sandbox Code Playgroud)

但它在括号上打破了.

有任何想法吗?

TIA,丹尼尔:)

编辑:我应该注意到我正在使用"shopt -s nocasematch"来确保不区分大小写的匹配,以防万一你想知道:)

编辑2:感谢所有贡献者.我不是100%肯定哪个答案是"正确的",因为我的陈述有几个问题.实际上,最准确的答案只是对jw013发布的问题的评论,但我当时没有得到它,因为我还没有理解空间应该被转义.我选择了aefxx,因为那个基本上都是一样的,但有解释:)我们也想在ormaaj的答案上加上正确的答案标记,因为他发现了我表达的更严重的问题.

无论如何,我上面使用的方法,尝试匹配和提取部分以保留和留下不需要的部分真的不是很优雅,并不会捕捉所有情况,甚至不是像"Some.Show.S07E14"这样简单的东西.720p.HDTV.X264-SOMEONE - [www.Speed.Cd]".我改为重写它以匹配并提取不需要的部分,然后对原始字符串上的字符串进行字符串替换,就像这样(循环以防万一有多个品牌):

# Remove common torrent site brandings, including surrounding spaces, brackets, etc.:
while [[ "$newfile" =~ ([[\ {\(-]*(www\.)?(torrentday\.com|torrenting\.com|spastikustv|speed\.cd|moviesp2p\.com|publichd\.org|publichd|scenetime\.com|kingdom-release)[]\ }\)-]*) ]]; do
    newfile=${newfile//"${BASH_REMATCH[1]}"/}
done
Run Code Online (Sandbox Code Playgroud)

regex bash

5
推荐指数
1
解决办法
1万
查看次数