作者cuello (cuello)
看板Linux
标题Re: [问题] 这个 sed-缩网址程式何时会爆炸?
时间Sat Nov 7 17:40:40 2020
※ 引述《Gold740716 (项为之强)》之铭言:
: 其实不一定要全部挤在同一行。
: 看你好像对 sed 还有爱,可以看看 sed 的语法。
: 我会把不同的 pattern 写成不同行,会比较好读,
: 也不用想要怎麽把一堆 pattern 挤在同一个 regexp 里。
: 反正只会有一行能成功匹配执行,其它会因为不匹配就放掉了。
: 另外你的 (idempotent) ,是保留 protocol 而已吗?
: 还是希望连 querystring 其它参数也保留?
是为了避免上 ptt 被骂没缩网址,
所以那些都一并去掉
给时间用手加就好
这应该符合大多数人的需求 :)
喔对,我借用 idempotent 来表示
缩过的, 再缩一次必须得到同样答案
像 include file 不必担心有没 include 过
因为有 #ifndef ... #define ... #endif
但是我那 one-liner, 现在还不能证明是 A^2=A
虽然目前的行为***似乎是**...
展像你这样展开来的话
要是碰到有甚麽要增加
真的容易多了
: 要的话可能要多写几个 pattern 去抓。
: ```sh
: youtu() {
: local vid
(... snip snip ...)
-------------------------------
#!/bin/sh
#
# 1. 把两个函数放一起, 用 -2 叫 Gold740716 的 youtu2()
# 2. 我先把 youtu2() 的 local 遮起来, 改 _vid_ 避撞 (posix?)
# 3. 假设 FreeBSD 原生 sed 还是会 match \n, 谁帮试试看?
# 4. idempotent 代数是 A^2 = A 的意思 (缩过的网址再缩一次)
# 5. 有个 stderr 我不晓得哪来的... 能不能帮忙找一下, tail?
#
# $ xsel | youtu -2
# tail: cannot open '' for reading: No such file or directory
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#
http://youtu.be/11111111111 这行??? 哪来的 tail????
#
http://youtu.be/22222222222
#
http://youtu.be/33333333333
#
http://youtu.be/44444444444
#
http://youtu.be/55555555555
#
http://youtu.be/66666666666
#
http://youtu.be/77777777777
#
http://youtu.be/88888888888
#
http://youtu.be/99999999999
#
http://youtu.be/aaaaaaaaaaa
#
http://youtu.be/bbbbbbbbbbb
#
http://youtu.be/ccccccccccc
#
http://youtu.be/ddddddddddd
# #
http://youtu.be/idempotence
#
# 6. 1604981049 问题 5 已解决, 请搜寻左边 time_t
# 那是因为 '\n' 被写为 back stocks `\n`(键盘左上)
#
# 为方便测试, 可以整块反白起来, 丢给它
# (把这整个档案自己丢给它自己也很有意思...)
#
https://www.youtube.com/v/11111111111
#
https://www.youtube.com/watch?v=22222222222
#
https://www.youtube.com/embed/33333333333?rel=0
#
https://www.youtube.com/watch?argv=xyz&v=44444444444
#
https://www.youtube.com/watch?v=55555555555&list=PLDB852818BF378DAC
#
https://www.youtube.com/watch?v=66666666666&feature=related
#
https://www.youtube.com/watch?argv=xyz&v=77777777777
#
https://www.youtube.com/watch?v=88888888888&feature=feedrec_grec_index
#
https://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/99999999999
#
https://www.youtube.com/v/aaaaaaaaaaa?fs=1&hl=en_US&rel=0
#
https://www.youtube.com/watch?v=bbbbbbbbbbb#t=0m10s
#
https://www.youtube.com/embed/ccccccccccc?rel=0
#
https://www.youtube.com/watch?v=ddddddddddd
#
http://youtu.be/idempotence
youtu() # lantw44 Gold740716
{
sed 's|.*\(https*\):.*[/vd]\{0,1\}[0-9vd][/=]\([0-9a-zA-Z_-]\{11\}\).*$|\1://youtu.be/\2|' | awk 1
# lantw44: FreeBSD \n issue
# sed 's|^\(http[s]\{0,1\}\):.*[/vd]\{0,1\}[0-9vd][/=]\([0-9a-zA-Z_-]\{11\}\).*$|\1://youtu.be/\2\
#|' | tr -s '\n'
}
youtu2() # provided by Gold740716
{
# local vid
# 怕有些 shells 还没做 scope 先变态避免相撞
# 我以前没用过底线, 请住帮看看有无问题? portable?
# 还没去查 POSIX 怎麽讲...
_vid_='\([0-9a-zA-Z_-]\{11\}\)'
sed "
# 新增确保 idempotence (i.e. youtu | youtu = youtu)
/https*:\/\/youtu.be\/$_vid_/q
# hold protocol to hold space
h
s|.*\(https*://\).*|\1|
s|\$|youtu.be/|
x
# only one of them should match
s|.*/v/$_vid_\$|\1|
s|.*/v/$_vid_?.*|\1|
s|.*/watch?v=$_vid_.*|\1|
s|.*/watch?.*&v=$_vid_.*|\1|
s|.*/user/.*/[0-9]*/$_vid_\$|\1|
s|.*/user/.*/[0-9]*/$_vid_?.*|\1|
s|.*embed/$_vid_\$|\1|
s|.*embed/$_vid_?.*\$|\1|
# append replace result to hold space
# then move all to pattern space
H
g
# there should be a \n after Hold, so remove it,
# but someone point that freebsd sed does not support '\n'
# 1604981049 上一行的 '\n' 本来是 back sticks , 已改为 ''.
# 引起 sed 里真正的 command substitution!
#s/\n//
" | tr -d '\r\n'
echo
# 1604799836 抱歉没改回来, 这里回复 Gold740716 原本的码
}
YOUTU="youtu"
[ "$1" = "-2" ] && YOUTU="youtu2" && shift
if [ -t 0 ] # priority: stdin > "$1" > X-clipboard
then
if [ "$1" ]
then
echo "$1" | $YOUTU
else # priority: termux > Mac > X11
XGET="xsel"
uname | grep -q "Darwin" && XGET="pbpaste" # rickieyang
echo "$HOME" | grep -q "termux" && XGET="termux-clipboard-get"
$XGET | $YOUTU
fi
else $YOUTU ; fi
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.115.149.134 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Linux/M.1604742042.A.F79.html
1F:→ cuello: 天哪,手机版真的太自动了 11/07 17:50
2F:→ cuello: 不晓得 ptt 有没有像 verbatim 这种东西? 11/07 17:50
3F:推 Gold740716: awk 1 是什麽? 11/07 19:49
4F:→ cuello: 是 awk 用的真假值, 写为 1==1 应该比较不容易误导 11/07 22:20
5F:→ cuello: 因为很多人头痛如何确保尾巴有个 \n 就有人想出这办法 11/07 22:22
6F:→ cuello: 网路上有人在酷酷嫂, \n 又不容易搞定, 就有人出怪招 11/07 22:24
7F:→ cuello: 然後我也还不确定 mawk/gawk/.. 这行为是否每个平台都一致 11/07 22:26
8F:→ cuello: 就等着看有没有人用出问题... 11/07 22:26
9F:→ cuello: 动这念头是因为用滑鼠常没割到 \n, paste 出来看不清楚 11/07 22:28
10F:→ Gold740716: 就 tr -d '\n' ,之後再手动 echo 补上一个就好啦 11/07 23:39
11F:→ Gold740716: 如果怕出问题 11/07 23:39
12F:→ cuello: 好,我等一下来看看 11/08 09:29
※ 编辑: cuello (59.115.149.134 台湾), 11/08/2020 10:02:08
13F:→ cuello: 那一行 tail: cannot open '' for reading: No such file 11/08 10:26
14F:→ cuello: 好像发生在定义 _vid_ 前後, 我印象中一直都有 11/08 10:27
15F:→ cuello: 难到是我的电脑? 还有, 在我手机上是: 11/08 10:28
16F:→ cuello: "youtu: 1: n: not found" 11/08 10:28
17F:→ Gold740716: 不然你就 set -x 再 xsel | youtu -2 ,用 debug 模式 11/08 15:09
18F:推 holishing: 推 set -x 11/08 22:07
19F:推 ucrxzero: set -e 也不错 11/08 23:30
1604981049 多谢! 其实我用 sh -x 看过, 只是没耐心好好看。
因为怎麽也没想到 sed 的 comment lines 里面出现的 `\n`
back sticks 会被当做 command substitution 真的去执行!
就算换成 $(), 它也执行, 而且 sed 被 blocked 住直到 n 了事!
所以看到的是 n 的 stderr, stdout 并未影响 pattern space.
(啊对, 可搜以搜寻以上 time_t 找到这次编辑的地方)
好, 那现在另一个问题: 这是 sed(1) 的 feature 还是 bug?
我笔电是 sed (GNU sed) 4.7 手机是 sed (GNU sed) 4.8
两个版本都是一样的行为: 在 comment lines 里做
command substitution! 嘿, 我从来都没听过这种事!
sh, dash, posh, ksh, ash, bash 都可以随兴 comment 喔
但 GNU sed 不行! 这是在.... hallo---
还没解释 n: 我的 PATH 里有很多荒废不用暂时性的测试程式
它们多用很短的名字. /tmp/ 里也一堆... 久了就忘了! 警惕...
※ 编辑: cuello (59.115.193.4 台湾), 11/10/2020 12:43:37
20F:推 Gold740716: 因为在双引号里 shell 会替换 `` $() ,单引号就不会 11/11 13:39