看板 Linux 關於我們 聯絡資訊
食飽未, 如題, 我想用 ed(1) 碰到問題 ------------------------------- #!/bin/sh # -- append-text-to-the-last-non-blank-line --- text=" 寫在最後一個非空白行尾巴" ed -s "$1" [小於 小於] EOF >/dev/null ?.?s/$/$text/ wq EOF --------------------------------- 倒也順利, 只不過不曉得除了 -s 之外 還有沒有個 --really-quiet? 一定要用 >/dev/null 嗎? 其實這還不是重點 上面的程式碰到尾巴沒有空白行的檔案就錯了! 因為, 好像 ?.? 會從最後第二行找起 結果就錯過了最後一行... 這裡有沒有真的用過 ed(1) 的人啊? PS. 剛剛連續幾次要打 here-document 的 小於 弄亂的 ptt 的 editor, 也不知怎麼回事.,,, -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.36.62.143 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1666614705.A.A7A.html
yvb: ed -s cuello.txt << EOF >/dev/null 2>&1 10/24 21:34
yvb: 1 10/24 21:34
yvb: ?.?s/$/$text/ 10/24 21:34
yvb: wq 10/24 21:35
yvb: EOF 10/24 21:35
yvb: 試過修改 cuello.txt 看起來 OK. :P 10/24 21:37
哈哈哈... 我都合不嚨嘴巴了, 真的耶! ed(1) 還會繞回去喔~~~ ho ho ho ho ho ho 唉, 怎麼辦? 也不知道怎麼謝啦... ※ 編輯: cuello (114.36.62.143 臺灣), 10/24/2022 21:41:52 ※ 編輯: cuello (114.36.62.143 臺灣), 10/24/2022 22:19:05
cckuan2718: ed(1)讀取玩檔案會把行號設成最後一行... 很怪的設 10/25 15:03
cckuan2718: 計 10/25 15:03
cuello: 純亂想, 啊我檔案讀完指標就是指在這裡啊~ :) 10/25 21:32
※ 編輯: cuello (114.36.70.90 臺灣), 10/26/2022 20:55:04
yvb: 這樣想也沒錯啊. 查看 ed 的 man page, LINE ADDRESSING 的 10/26 20:46
yvb: 第一段的最後兩句, 想像 ed file 就是進 ed 後再做 r file , 10/26 20:48
yvb: 再去查看 r file 就是如此. 10/26 20:50
是說, Debian 為甚麼決定預設不裝 ed(1)? 是煩惱會把硬碟塞暴? 還是基於甚麼微妙的, 長遠的考量要省下這個 package? 所以, 我還要考量人家有沒有 "Standard Editor" 可用... 沒有的話, 有沒有權限安裝? 這些盤算自然要衍生一個問題, 以上這件事情, 不用 ed(1) 的話, 大家都是怎麼做的? 這種任務應該常碰到吧... 用 ed(1) 之前, 我自己自然也做過, 可是, 就不拿出來見笑了好嗎? 因為連我自己都看不下去.... P.S. 還有, 好像 dc(1) 也很容易塞暴硬碟, 所以 Debian 就暫時不安裝了嗎... ※ 編輯: cuello (114.36.70.90 臺灣), 10/26/2022 20:58:18
yvb: ed 和 dc 都是很久遠的工具了吧. 使用 ex(vim) 和 bc 不好嗎? 10/26 21:12
yvb: 至於在最後一行說是怪設計... 久遠的工具當然有其歷史背景. 10/26 21:19
cuello: 啊~~ ex(1) 我還沒試過說... 10/26 21:32
cckuan2718: 之前看完Ed Mastery這本書之後試過用ed(1)裝arch L 10/26 22:11
cckuan2718: inux 10/26 22:11
cckuan2718: 最後雖然一切正常 但我的心得.. 用cat加上heredoc 10/26 22:12
cckuan2718: 或是直接用sed 10/26 22:12
cckuan2718: 搞不好還比較快 10/26 22:12
經 yvb 提醒, 剛剛才發現, 上面那個程式, 可以把 "ed" 直接改為 "ex" 結果一樣! 起碼就這件事情而言, ex(1) 跟 ed(1) "相容" 現在好奇, ex(1) 也有意要取代 ed(1) 嗎? 不是, 用 sed 做這件事, 我就不會啊~~ 起碼不是那麼直接、乾翠... ※ 編輯: cuello (114.36.69.3 臺灣), 10/26/2022 22:47:57
leolarrel: 當初你也不會ed/ex, 所以你也只是"現在"不會sed 10/27 10:06
※ 編輯: cuello (114.36.69.3 臺灣), 10/27/2022 20:22:30
yvb: 與其說幹話, 樓上要不要提供原PO這個問題使用 sed 的做法? 10/27 20:06
yvb: 這問題我覺得使用 ed/ex 似乎簡單許多. 10/27 20:10
yvb: ed ex 的故事請自行參考 wikipedia. 10/27 20:19
※ 編輯: cuello (114.36.69.3 臺灣), 10/27/2022 20:24:08 哈哈, 每次編輯文章的時候, 都跟 yvb 剛好 "相出路" 我再次把剛寫的部份移到最後面: 你可能誤會了... 我的意思是: e.g. sed(1) et al. for THIS VERY TASK How, would you do that? A     sed -i .... ? 不要再建個新檔, 再覆寫掉正本. 我的感覺是, sed 像是在錄音室編輯磁帶 你每一個時候只看到錄音帶的一個窗子 錄音頭位置跟它週遭 這一類的媒體, 必要時, 有可能涉及 "2nd pass" editing 這是 sequential access media 的本質 不同於 random access media ed, ex 雖然不見得一次載入所有 data 但它在本質上是 random access, 適合執行像是     1,3m$ 這種工作 為了避免太被自己的盲點屏蔽, 我才問大家說 sed(1) awk(1) 真得也可以做得直接了當嗎? 這一定會是很值得學習的啊 ~~~ ※ 編輯: cuello (114.36.69.3 臺灣), 10/27/2022 20:29:03
yvb: sed -i 或許可以, 但應該會用 b x h 等我覺得很不直覺的操作. 10/27 20:33
我只試到印出最後一個非空白行就卡住了:      sed -n -e '/^$/ !h' -e '$ {x;p;}' ※ 編輯: cuello (114.36.69.3 臺灣), 10/27/2022 20:43:48
leolarrel: 會是幹話嘛? 好拉你說是就是,反正這是世界是你最大 10/28 14:55
yvb: 套句大師兄的話, 不要誤會, 我不是針對你... :P 11/07 22:09
yvb: 包含我自已,說些好像有理其實沒啥幫助或不相干的話,都是幹話. 11/07 22:11
yvb: 回正題, 這問題用 sed 好像找到的解法, 多半是搭配 tac, 不然 11/07 22:18
yvb: 就是特定 pattern 而不是非空白行... 11/07 22:20
yvb: 所以我做個變換, 先將非空白行換成特定 pattern 結尾, 最後 11/07 22:21
yvb: 再換回去... 因此寫法如下: sed -i \ 11/07 22:21
yvb: 's/.$/&=/;1h;1!H;$!d;x;s/\(.*\)=/\1'"$text"'/;s/=\n/\n/g' 11/07 22:23
yvb: 不確定是否可以完全正常運作就是了. 11/07 22:24
目前為止, flawless! 好像沒太多人對這個問題感興趣 大概是沒時間去想暫時跟自己無關的事情 但是,一旦碰到了,會各自上網查尋,然後, 會在 ptt Linux 這篇找到最 satisfying 的解答 (I suppose) 就是以上 yvb 所提的 ed(1) 跟 sed(1) 的解 這就是我們常講的所謂 contribution, 不是嗎 等 yvb 有空, 有力氣時, 能不能請解釋一下你的 設計, 構想, 以及 implementation 因為, 我覺得這是個值得參考的範例 1. 一個一行字就講得清楚的問題, 以及 2. 一個經過構思, 實現, 實用的解答 其實, 我會碰到問題, 除了「明顯」的需求之外 也是因為我自己常常在下載的圖檔的尾巴 偷偷 append 這的檔案的來源 然後用 tail -1 因為還沒看過有 image viewer 會跟人計較這些多餘的 "data"... 以上的 sed -i 指令只有在碰到 binary file 會失敗 ※ 編輯: cuello (219.68.108.132 臺灣), 11/22/2022 22:26:54