【发布时间】:2022-11-10 22:20:11
【问题描述】:
假设我有以下文本文件:
a b c d 1 2 3
e f g h 1 2 3
i j k l 1 2 3
m n o p 1 2 3
如何在包含字母 (e) 的行中将 '1 2 3' 替换为 '4 5 6'和将它移到包含字母 (k) 的行之后?
我的方法是
- 删除我要替换的行
- 找线前我想移动它的那条线
- 找线后我想移动它的那条线
- 将输出附加到文件中
grep -v 'e' $original > $file grep -B999 'k' $file > $output grep 'e' $original | sed 's/1 2 3/4 5 6/' >> $output grep -A999 'k' $file | tail -n+2 >> $output rm $file mv $output $original但是这个解决方案有很多问题:
- 很多
grep似乎不必要的命令 - 参数
-A999和-B999假设文件不会包含超过999 行,最好有另一种方法来获取匹配行之前和之后的行我正在寻找一种更有效的方法来实现这一目标
- 很多
【问题讨论】:
-
这是一次性替换还是全球性的?即,每行
e移动到每行k之后?或者只是一个替换然后退出?如果每一行,什么顺序?如果找不到k行怎么办? -
@dawg 它应该是一个单独的替换,并且假设 k 存在