Re: [問題] 這個 sed-縮網址程式何時會爆炸?
※ 引述《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
#
# 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/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
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
11/07 17:50, 2F
推
11/07 19:49,
4年前
, 3F
11/07 19:49, 3F
→
11/07 22:20,
4年前
, 4F
11/07 22:20, 4F
→
11/07 22:22,
4年前
, 5F
11/07 22:22, 5F
→
11/07 22:24,
4年前
, 6F
11/07 22:24, 6F
→
11/07 22:26,
4年前
, 7F
11/07 22:26, 7F
→
11/07 22:26,
4年前
, 8F
11/07 22:26, 8F
→
11/07 22:28,
4年前
, 9F
11/07 22:28, 9F
→
11/07 23:39,
4年前
, 10F
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
11/08 10:26, 13F
→
11/08 10:27,
4年前
, 14F
11/08 10:27, 14F
→
11/08 10:28,
4年前
, 15F
11/08 10:28, 15F
→
11/08 10:28,
4年前
, 16F
11/08 10:28, 16F
→
11/08 15:09,
4年前
, 17F
11/08 15:09, 17F
推
11/08 22:07,
4年前
, 18F
11/08 22:07, 18F
推
11/08 23:30,
4年前
, 19F
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
11/11 13:39, 20F
討論串 (同標題文章)
Linux 近期熱門文章
23
129
PTT數位生活區 即時熱門文章