sed 删除代码块,有没有一次性好办法呢?

2021-04-10 09:36:07 +08:00
 sjmcefc2
如题:
aaa
123
123
123
123
123
eee


需求 是删除 aaa 开头 到 eee 结尾的代码块,
这样需要如何写呢?
1972 次点击
所在节点    程序员
15 条回复
ppxppx
2021-04-10 09:39:02 +08:00
find . -type f | xargs sed -i 's/^aaa.*eee$//g'
sjmcefc2
2021-04-10 09:40:58 +08:00
代码块是不同行的
^aaa 是开头吧,eee$是结尾。

这样是不是必须要同一行才可以删除呢
hztDbFXEed73dkMf
2021-04-10 09:58:15 +08:00
find . -type f|xargs sed -i.bak '/aaa/,/eee/d'
yuanmomo
2021-04-10 10:26:23 +08:00
@sjmcefc2 sed 可以匹配行的方式来匹配起始行号,然后操作这个行范围之内的
Akiyu
2021-04-10 10:30:21 +08:00
sed 有多行模式. 你可以参考一下.
那东西不仅麻烦也很少用, 一般你得自己研究.
https://www.gnu.org/software/sed/manual/sed.html
重点关注一下. 7.1 Joining lines
我记得之前有用它处理过多行文本处理的问题. 应该是可行的.
scinart
2021-04-10 10:56:55 +08:00
sed 从 3 删到 6, see `info sed` 6.3 Multiline techniques

seq 9 | sed '/3/{:x; s.6.6.; tn; N; bx; :n; d;}'
Jirajine
2021-04-10 10:59:48 +08:00
你在这里琢磨 sed 的时间,直接用 Python 已经写好了。
sjmcefc2
2021-04-10 11:07:09 +08:00
python 也可以?大神赐教
kokutou
2021-04-10 11:10:01 +08:00
py 按行读取, 写入到临时文件, 遇到 aaa 就不写了,到了 eee 再继续写....
sjmcefc2
2021-04-10 11:12:07 +08:00
@elsonwx 这个可行,'/aaa/,/eee/d' 里面这个,的意思是啥呢
sjmcefc2
2021-04-10 11:32:11 +08:00
另外,不如我想在 aaa 和 eee 之间插入一些不同行的代码,该怎么做呢
sjmcefc2
2021-04-10 13:59:17 +08:00
另外,不如我想在 aaa 和 eee 之间插入一些不同行的代码,该怎么做呢
-----
用\n 来换行就可以了。
no1xsyzy
2021-04-10 18:51:54 +08:00
基本骨架长这样

#!/usr/bin/env python3
import sys
for line in sys.stdin:
  assert line[-1] in "\r\n"
  sys.stdout.write(line)

chmod +x 或者 python3 a <in.txt >out.txt
然后随意改改就成。
no1xsyzy
2021-04-10 18:56:52 +08:00
(啊,如果最后一行结尾不在第一列是没有 line break 的,忘记那句 assert 吧
smyle
2021-04-10 23:38:38 +08:00
sed '/aaa/,/eee/d' $文件名
意思就是删除 aaa 到 eee 之间的所有行(正则匹配,包括 aaa 和 eee 本身)

如果要保留 aaa 和 eee 这两行的话
sed '/aaa/,/bbb/{/aaa/!{/bbb/!d}}' $文件名

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/769640

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX