Re: [問題] 這個 sed-縮網址程式何時會爆炸?

看板Linux作者 (cuello)時間4年前 (2020/11/07 17:40), 4年前編輯推噓4(4016)
留言20則, 4人參與, 4年前最新討論串3/3 (看更多)
※ 引述《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 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.115.149.134 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1604742042.A.F79.html

11/07 17:50, 4年前 , 1F
天哪,手機版真的太自動了
11/07 17:50, 1F

11/07 17:50, 4年前 , 2F
不曉得 ptt 有沒有像 verbatim 這種東西?
11/07 17:50, 2F

11/07 19:49, 4年前 , 3F
awk 1 是什麼?
11/07 19:49, 3F

11/07 22:20, 4年前 , 4F
是 awk 用的真假值, 寫為 1==1 應該比較不容易誤導
11/07 22:20, 4F

11/07 22:22, 4年前 , 5F
因為很多人頭痛如何確保尾巴有個 \n 就有人想出這辦法
11/07 22:22, 5F

11/07 22:24, 4年前 , 6F
網路上有人在酷酷嫂, \n 又不容易搞定, 就有人出怪招
11/07 22:24, 6F

11/07 22:26, 4年前 , 7F
然後我也還不確定 mawk/gawk/.. 這行為是否每個平台都一致
11/07 22:26, 7F

11/07 22:26, 4年前 , 8F
就等著看有沒有人用出問題...
11/07 22:26, 8F

11/07 22:28, 4年前 , 9F
動這念頭是因為用滑鼠常沒割到 \n, paste 出來看不清楚
11/07 22:28, 9F

11/07 23:39, 4年前 , 10F
就 tr -d '\n' ,之後再手動 echo 補上一個就好啦
11/07 23:39, 10F

11/07 23:39, 4年前 , 11F
如果怕出問題
11/07 23:39, 11F

11/08 09:29, 4年前 , 12F
好,我等一下來看看
11/08 09:29, 12F
※ 編輯: cuello (59.115.149.134 臺灣), 11/08/2020 10:02:08

11/08 10:26, 4年前 , 13F
那一行 tail: cannot open '' for reading: No such file
11/08 10:26, 13F

11/08 10:27, 4年前 , 14F
好像發生在定義 _vid_ 前後, 我印象中一直都有
11/08 10:27, 14F

11/08 10:28, 4年前 , 15F
難到是我的電腦? 還有, 在我手機上是:
11/08 10:28, 15F

11/08 10:28, 4年前 , 16F
"youtu: 1: n: not found"
11/08 10:28, 16F

11/08 15:09, 4年前 , 17F
不然你就 set -x 再 xsel | youtu -2 ,用 debug 模式
11/08 15:09, 17F

11/08 22:07, 4年前 , 18F
推 set -x
11/08 22:07, 18F

11/08 23:30, 4年前 , 19F
set -e 也不錯
11/08 23:30, 19F
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

11/11 13:39, 4年前 , 20F
因為在雙引號裡 shell 會替換 `` $() ,單引號就不會
11/11 13:39, 20F
文章代碼(AID): #1VfckQzv (Linux)
文章代碼(AID): #1VfckQzv (Linux)