→ Typebrook: 還沒看完,不過要大量用到Regex的話,sed建議加-E 11/04 09:04
→ Typebrook: 這樣很多地方就不用加反斜線了 11/04 09:05
→ Typebrook: 然後我會這樣寫: 11/04 09:18
→ Typebrook: sed -Ee 's@(http|https)://.*[/=]([0-9a-zA-Z_-]{11}) 11/04 09:18
→ Typebrook: .*@\1://youtu.be/\2@' 11/04 09:19
→ Typebrook: 如果確定都是11碼後9碼以上,vd那段其實不用加 11/04 09:19
→ Typebrook: 或者也可以把{11}改成{11,} 11/04 09:26
多謝,我看我們還是先照顧跨平台適應性吧
另外,那段很醜的 vd 甚麼,
是 ad hoc 應付後面雜雜八的水管選項
否則好像過不了關, 你有試過可以嗎?
另外,我也不確定 http 會不會出現大寫 HTTP...
推 bitlife: 你要找何時會爆是要找實務上可見的,還是故意弄出會爆但實 11/04 09:27
→ bitlife: 務上不(太可能)會出現的? 11/04 09:28
基本上,先照料實務上尚未預見的狀況好了
i.e. 火箭升空自爆的狀況,先不管是否有外星人故意推它
來看看,擺在這裡一個月,是否可能弄堅固一點
讓它可以拿到任何認得 #!/bin/sh 的地方就跑
也讓我多長點見識
→ lantw44: shell script 部分的 portability 可以先跑 shellcheck 11/05 00:03
→ lantw44: 看看有沒有問題,而一樓說的 sed -E 在 POSIX 沒有,所以 11/05 00:04
→ lantw44: 可以猜想如果有的系統只做 POSIX 那就不能用 sed -E。 11/05 00:05
→ lantw44: 實際測試這個 script 在 FreeBSD 執行成功但結果有誤,因 11/05 00:08
→ lantw44: 為 FreeBSD 的 sed 不支援 \? 和 \n。 11/05 00:09
好,我稍後再去看 shellcheck
FreeBSD 燒了, 那麼到 Mac 上應該不會太好....
沒有 \? 的話, 那先用 http[s]\{0,1\} 吧
這裡我一直覺得很心虛, 因為 httpx: 也 match!?
不知為甚麼, \{m, n\} 對我而言一直都是"失控"的...
\n 的話, 那大概只能斷成兩行了,
反正, 另外設個變數 NL="\n" 來用在 sed 裡, 也一樣醜...
※ 編輯: cuello (118.167.174.150 臺灣), 11/05/2020 14:16:25
剛去裝了 shellcheck. 它對我的 A && B || C 有意見
SC2015: Note that A && B || C is not if-then-else.
C may run when A is true.
請問有人,甚麼情況下碰過 A=true 但 C 卻被執行的?
※ 編輯: cuello (118.167.174.150 臺灣), 11/05/2020 14:41:56
推 rickieyang: B false? 11/05 15:30
→ cuello: 是說,我一直相信,B false 的情況,跟 C 一樣, 11/05 15:59
→ cuello: evaluation 會停下來,return false 的值... 11/05 15:59
→ cuello: 對於 Bourne shell 而言,我一直保持這種態度, 11/05 16:01
→ cuello: 現在居然要被推翻了嗎? :( 11/05 16:01
→ cuello: 因為答案是 false 已經得到了 11/05 16:10
→ cuello: 就不繼續 evaluate C 了 11/05 16:10
→ cuello: 有誰在哪個系統上,哪個 shell 會繼續做 C 嗎? 11/05 16:10
→ bitlife: 假設A true,但如果B為false,就會去執行C啊 11/05 16:19
→ bitlife: (後方命令會印出hello) $ true && false || echo hello 11/05 16:20
→ cuello: 對對對,我是錯的,頭殼壞掉了才會這樣 11/05 17:12
各位,我一直習慣性地把 A && B || C
拿來當 if-then-else, 這是很白蚩的!
不過這個介面問題先不改了,
我們先聚焦在那一行(變兩行了) sed 吧
※ 編輯: cuello (118.167.174.150 臺灣), 11/05/2020 17:21:02
※ 編輯: cuello (118.167.174.150 臺灣), 11/05/2020 18:06:49
另外請問大家,Mac 上面應該沒有 xsel(1) 吧
但是可能會有對應的指令, 還有要怎麼判斷是個 Mac?
※ 編輯: cuello (118.167.174.150 臺灣), 11/05/2020 22:13:37
推 rickieyang: 沒有 xsel, uname 會得到 Darwin 11/06 00:16
推 rickieyang: mac 要拿剪貼簿內容可以用 pbpaste 11/06 00:19
多了 Mac 會跑, 感覺總是比較好,希望是對的
推 Gold740716: 我覺得沒必要全部寫在同一行,你可以把 sed 分成很多 11/06 21:19
→ Gold740716: 行 11/06 21:20
→ Gold740716: 尤其是考慮到可讀性 11/06 21:20
是的,應該從善如流的,迷失的時候忽略可讀。
不過 regex 有時不大敢, 或懶得去動.
※ 編輯: cuello (59.115.149.134 臺灣), 11/06/2020 22:18:08
推 Gold740716: 我看 freebsd 的 sed 手冊是寫支援 `\n` 的啊? 11/06 23:20
推 lantw44: 手冊上指的應該是可以用 \n 配對輸入,但不能用在輸出。 11/07 13:29
→ lantw44: 根據 POSIX 的說法,若要在 s 指令中輸出換行,則要使用 11/07 13:35
→ lantw44: 反斜線加真正的換行字元。 11/07 13:37
所以 H 插入的 \n 是可以 match 到的?
那就可以去掉囉?
※ 編輯: cuello (59.115.149.134 臺灣), 11/07/2020 17:16:07
→ lantw44: 推文的時候我是用 N 測試的,可以 match 到。我也試過輸 11/07 20:09
→ lantw44: 出換行,用 \ 加換行字元是可以輸出的。 11/07 20:10
推 ucrxzero: 是說A &&(B||!B )||C其實就行啦 11/08 00:12
→ ucrxzero: 你會以為A&&B||C可行是因為 通常BC都不會當表達式了不 11/08 00:13
→ ucrxzero: 會care $?是否為0 11/08 00:13
→ cuello: 因為我B常是在做 assignment,用慣了開始錯覺吧 11/08 09:34
→ cuello: 所以不要常用成語,idiom 用多了會變 idiot! :) 11/08 09:34
→ bitlife: 用 A && (B||true) || C會更好,避免B不是idempotent以及 11/08 13:22
→ bitlife: 省運算時間 11/08 13:22
→ Gold740716: 但要用 {} ,用 () 會在子 shell 裡賦值沒有用 11/08 15:08
→ bitlife: 查了一下, (list) 的return value是list的值,實際用前述 11/08 15:55
→ bitlife: true false命令測試也確實如此 11/08 15:56
→ bitlife: true && (false||true) || echo hello 不會印hello 11/08 15:57
→ bitlife: true && (false||false) || echo hello 會印hello 11/08 15:58
→ bitlife: 喔,我懂了,是指前面u大說的拿來assignment 11/08 16:00
→ bitlife: 確實一律用 {} 比較不會搞混 11/08 16:01
推 ucrxzero: 樓上大大是對的 11/08 18:26
推 yoche2000: 推 學習了 11/09 01:19