這個 sed-縮網址程式何時會爆炸? - Linux

Mason avatar
By Mason
at 2020-11-07T17:40

Table of Contents

※ 引述《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`(鍵盤左上)
#
# 為方便測試, 可以整塊反白起來, 丟給它
# (把這整個檔案自己丟給它自己也很有意思...)
# http://www.youtube.com/v/11111111111
# http://www.youtube.com/watch?v=22222222222
# http://www.youtube.com/embed/33333333333?rel=0
# http://www.youtube.com/watch?argv=xyz&v=44444444444
# http://www.youtube.com/watch?v=55555555555&list=PLDB852818BF378DAC
# http://www.youtube.com/watch?v=66666666666&feature=related
# http://www.youtube.com/watch?argv=xyz&v=77777777777
# http://www.youtube.com/watch?v=88888888888&feature=feedrec_grec_index
# http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/99999999999
# http://www.youtube.com/v/aaaaaaaaaaa?fs=1&hl=en_US&rel=0
# http://www.youtube.com/watch?v=bbbbbbbbbbb#t=0m10s
# http://www.youtube.com/embed/ccccccccccc?rel=0
# http://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


--
Tags: Linux

All Comments

Edwina avatar
By Edwina
at 2020-11-09T20:01
天哪,手機版真的太自動了
不曉得 ptt 有沒有像 verbatim 這種東西?
Todd Johnson avatar
By Todd Johnson
at 2020-11-11T22:22
awk 1 是什麼?
James avatar
By James
at 2020-11-14T00:43
是 awk 用的真假值, 寫為 1==1 應該比較不容易誤導
Edwina avatar
By Edwina
at 2020-11-16T03:04
因為很多人頭痛如何確保尾巴有個 \n 就有人想出這辦法
Edith avatar
By Edith
at 2020-11-18T05:25
網路上有人在酷酷嫂, \n 又不容易搞定, 就有人出怪招
Audriana avatar
By Audriana
at 2020-11-20T07:46
然後我也還不確定 mawk/gawk/.. 這行為是否每個平台都一致
就等著看有沒有人用出問題...
Carolina Franco avatar
By Carolina Franco
at 2020-11-22T10:07
動這念頭是因為用滑鼠常沒割到 \n, paste 出來看不清楚
Charlie avatar
By Charlie
at 2020-11-24T12:28
就 tr -d '\n' ,之後再手動 echo 補上一個就好啦
如果怕出問題
Annie avatar
By Annie
at 2020-11-26T14:49
好,我等一下來看看
Lauren avatar
By Lauren
at 2020-11-28T17:10
那一行 tail: cannot open '' for reading: No such file
Emily avatar
By Emily
at 2020-11-30T19:31
好像發生在定義 _vid_ 前後, 我印象中一直都有
Kumar avatar
By Kumar
at 2020-12-02T21:52
難到是我的電腦? 還有, 在我手機上是:
"youtu: 1: n: not found"
Elizabeth avatar
By Elizabeth
at 2020-12-05T00:13
不然你就 set -x 再 xsel | youtu -2 ,用 debug 模式
Valerie avatar
By Valerie
at 2020-12-07T02:34
推 set -x
Adele avatar
By Adele
at 2020-12-09T04:55
set -e 也不錯
Isla avatar
By Isla
at 2020-12-11T07:16
因為在雙引號裡 shell 會替換 `` $() ,單引號就不會

這個 sed-縮網址程式何時會爆炸?

Quintina avatar
By Quintina
at 2020-11-06T22:41
其實不一定要全部擠在同一行。 看你好像對 sed 還有愛,可以看看 sed 的語法。 我會把不同的 pattern 寫成不同行,會比較好讀, 也不用想要怎麼把一堆 pattern 擠在同一個 regexp 裡。 反正只會有一行能成功匹配執行,其它會因為不匹配就放掉了。 另外你的 (idempotent) , ...

這個 sed-縮網址程式何時會爆炸?

Sandy avatar
By Sandy
at 2020-11-04T06:52
#!/bin/sh # # 1604436674 created for testing in Linux/PTT # # 這是個 YouTube 縮網址的 one-liner. 必須很 portable. # 我已測試過各種不同形狀的水管 urland#39;s 例如: # # /v/andlt ...

求推薦Linux gcc c語言的指令的書

Caitlin avatar
By Caitlin
at 2020-11-02T23:46
最近開始學用ubuntu的gcc寫C 可是常常遇到想要什麼功能 卻不知道有沒有直接適用的指令 雖然知道好像可以用man詢問 不過卡在一開始的關鍵字就不知道要怎麼詢問了 不知道有沒有類似的指令書可以參考的 當然有範例or中文的話最好了 - ...

apt-get 載入libraries出錯

Noah avatar
By Noah
at 2020-11-02T22:54
我是用raspberry pi 3 今天發現我的samba掛了 怎樣都無法重啟 想要重新安裝 但用apt-get安裝時,發現我的apt-get也無法使用 apt-get後面接所有指令都是一樣的狀況 piatraspberrypi:~ $ sudo apt-get update sudo: unabl ...

Top指令內的Mem in_d是什麼意思?

Candice avatar
By Candice
at 2020-11-02T16:43
如題 近期在工作上面有遇到程式執行時間越來越長的問題 目前情況是第一次執行改程式只需要5秒. 持續執行該程式會發現所需時間越來越長,直到某個限度(ex.8秒)後就會穩定在8秒這個 耗時且不會在增加(僅限該程式有這個問題) 觀察top指令每個項目的變化率,有明顯差異的就是in_d就是會一路下降到0. 所以 ...