技术解析

sed 删除代码块,有没有一次性好办法呢?
0
2021-06-03 23:31:43
idczone
如题:
aaa
123
123
123
123
123
eee


需求 是删除 aaa 大带宽服务器开头 到 eee 结尾的代码块,
这样需要如何写呢?
find . -type f | xargs sed -i 's/^aaa.*eee$//g'

代码块是不同行的
^aaa 是开头吧,eee$是结尾。
这样是不是必须要同一行才可以删除呢

find . -type f|xargs sed -i.bak '/aaa/,/eee/d'

sed 可以匹配行的方式来匹配起始行号,然后操作这个行范围之内的

sed 有多行模式. 你可以参考一下.
那东西不仅麻烦也很少用, 一般你得自己研究.
https://www.gnu.org/software/sed/manual/sed.html
重点关注一下. 7.1 Joining lines
我记得之前有用它处理过多行文本处理的问题. 应该是可行的.

sed 从 3 删到 6, see `info sed` 6.3 Multiline techniques
seq 9 | sed '/3/{:x; s.6.6.; tn; N; bx; :n; d;}'

你在这里琢磨 sed 的时间,直接用 Python 已经写好了。

python 也可以?大神赐教

py 按行读取, 写入到临时文件, 遇到 aaa 就不写了,到了 eee 再继续写....

这个可行,'/aaa/,/eee/d' 里面这个,的意思是啥呢

另外,不如我想在 aaa 和 eee 之间插入一些不同行的代码,该怎么做呢

另外,不如我想在 aaa 和 eee 之间插入一些不同行的代码,该怎么做呢
-----
用\n 来换行就可以了。

基本骨架长这样
python3
import sys
for line in sys.stdin:
  assert line[-1] in "\r\n"
  sys.stdout.write(line)
chmod +x 或者 python3 a out.txt
然后随意改改就成。

(啊,如果最后一行结尾不在第一列是没有 line break 的,忘记那句 assert 吧

sed '/aaa/,/eee/d' $文件名
意思就是删除 aaa 到 eee 之间的所有行(正则匹配,包括 aaa 和 eee 本身)
如果要保留 aaa 和 eee 这两行的话
sed '/aaa/,/bbb/{/aaa/!{/bbb/!d}}' $文件名

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服