作者cuello (cuello)
看板Linux
標題[問題] 用 ed(1) 編輯最後一個非空白行
時間Mon Oct 24 20:31:43 2022
食飽未,
如題, 我想用 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://webptt.com/m.aspx?n=bbs/Linux/M.1666614705.A.A7A.html
1F:推 yvb: ed -s cuello.txt << EOF >/dev/null 2>&1 10/24 21:34
2F:→ yvb: 1 10/24 21:34
3F:→ yvb: ?.?s/$/$text/ 10/24 21:34
4F:→ yvb: wq 10/24 21:35
5F:→ yvb: EOF 10/24 21:35
6F:→ 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
7F:推 cckuan2718: ed(1)讀取玩檔案會把行號設成最後一行... 很怪的設 10/25 15:03
8F:→ cckuan2718: 計 10/25 15:03
9F:→ cuello: 純亂想, 啊我檔案讀完指標就是指在這裡啊~ :) 10/25 21:32
※ 編輯: cuello (114.36.70.90 臺灣), 10/26/2022 20:55:04
10F:推 yvb: 這樣想也沒錯啊. 查看 ed 的 man page, LINE ADDRESSING 的 10/26 20:46
11F:→ yvb: 第一段的最後兩句, 想像 ed file 就是進 ed 後再做 r file , 10/26 20:48
12F:→ 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
13F:推 yvb: ed 和 dc 都是很久遠的工具了吧. 使用 ex(vim) 和 bc 不好嗎? 10/26 21:12
14F:→ yvb: 至於在最後一行說是怪設計... 久遠的工具當然有其歷史背景. 10/26 21:19
15F:→ cuello: 啊~~ ex(1) 我還沒試過說... 10/26 21:32
16F:推 cckuan2718: 之前看完Ed Mastery這本書之後試過用ed(1)裝arch L 10/26 22:11
17F:→ cckuan2718: inux 10/26 22:11
18F:→ cckuan2718: 最後雖然一切正常 但我的心得.. 用cat加上heredoc 10/26 22:12
19F:→ cckuan2718: 或是直接用sed 10/26 22:12
20F:→ 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
21F:→ leolarrel: 當初你也不會ed/ex, 所以你也只是"現在"不會sed 10/27 10:06
※ 編輯: cuello (114.36.69.3 臺灣), 10/27/2022 20:22:30
22F:推 yvb: 與其說幹話, 樓上要不要提供原PO這個問題使用 sed 的做法? 10/27 20:06
23F:→ yvb: 這問題我覺得使用 ed/ex 似乎簡單許多. 10/27 20:10
24F:→ 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
25F:推 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
26F:→ leolarrel: 會是幹話嘛? 好拉你說是就是,反正這是世界是你最大 10/28 14:55
27F:推 yvb: 套句大師兄的話, 不要誤會, 我不是針對你... :P 11/07 22:09
28F:→ yvb: 包含我自已,說些好像有理其實沒啥幫助或不相干的話,都是幹話. 11/07 22:11
29F:→ yvb: 回正題, 這問題用 sed 好像找到的解法, 多半是搭配 tac, 不然 11/07 22:18
30F:→ yvb: 就是特定 pattern 而不是非空白行... 11/07 22:20
31F:→ yvb: 所以我做個變換, 先將非空白行換成特定 pattern 結尾, 最後 11/07 22:21
32F:→ yvb: 再換回去... 因此寫法如下: sed -i \ 11/07 22:21
33F:→ yvb: 's/.$/&=/;1h;1!H;$!d;x;s/\(.*\)=/\1'"$text"'/;s/=\n/\n/g' 11/07 22:23
34F:→ 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