作者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/cn.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