我正在尝试清理代码生成器的输出。不幸的是,它会生成多个导入:
import Foo
...
import Foo
幸运的是,生成的文本是相对静态的,尽管它经常重新生成,因此我希望有一种简单的方法可以删除它。
我已经计算出,如果他们在同一条线上,我可以:sed 's/import Foo//2g'
但是我不知道足够的 sed 使它只考虑所有行。
一个 hacky 解决方案是运行多个 sed...
sed 's/\n/<string I know doesn't appear>/g'
sed 's/import Foo//2g'
sed 's/<string I know doesn't appear>/\n'
但这感觉不对。有一个更好的方法吗?
它是如何工作的:在与模式匹配的每一行上
x
: 用保留空间交换行/^$/!d
:如果刚刚从保持空间中获取的内容不为空,即。因为以前的匹配存储在那里,删除模式并前进到下一行g
:否则(即第一次通过)将保存的行复制回来。它将默认打印使用 GNU 实现
sed
(您可能正在使用它,因为您已经使用了2g
GNUism),您可以这样做:这将删除
import Foo
除第一行之外的所有行。/^import Foo$/
如果您只想删除完全符合的 行,请将模式替换为import Foo
.你也可以
awk
在这里使用:如果您的
sed
版本允许,请尝试保持简单、便携等,并且使用 awk:
或者,如果它只是以
import
您想要使其唯一开头的行,并且您在输入中有其他您不想触摸的行: