【发布时间】:2010-10-31 03:36:08
【问题描述】:
您可以指定要操作的行范围。比如对所有行进行操作,(当然是默认的):
sed -e "1,$ s/a/b/"
但我需要对除最后一行之外的所有内容进行操作。你显然不能使用算术表达式:
sed -e "1,$-1 s/a/b/"
(在这种情况下,我使用的是 cygwin,如果有影响的话)
【问题讨论】:
标签: sed
您可以指定要操作的行范围。比如对所有行进行操作,(当然是默认的):
sed -e "1,$ s/a/b/"
但我需要对除最后一行之外的所有内容进行操作。你显然不能使用算术表达式:
sed -e "1,$-1 s/a/b/"
(在这种情况下,我使用的是 cygwin,如果有影响的话)
【问题讨论】:
标签: sed
sed -e "$ ! s/a/b/"
这将匹配除最后一行之外的每一行。通过快速测试确认!
【讨论】:
$ 选择最后一行。 ! 然后否定该行范围,选择每一行除了最后一行。然后在结果行范围内执行搜索替换。
这个命令也有效
sed '$d'
【讨论】:
我知道不是@987654321@,但我觉得head得到了最简单最灵活的方式:
head -n -1 the-file
使用-2、-3...而不是-1,检索除最后两行以外的所有行,等等。
【讨论】:
head(1)在mac上不能处理否定参数
嗯,你可以用这样的东西破解它:
sed -e "1,$(($(cat the-file | wc -l) - 1))s/a/b/"
或者,您可以改用tail:
(tail +1 the-file) | sed -e s/a/b/; tail -1 the-file
【讨论】:
在更一般的意义上,这个问题需要您通过指定一个范围来编辑流,其中一个范围限制是与文件结尾的偏移量。以下示例显示了如何执行此操作。在这个例子中,我打印出文件的所有行,从最后一行的第 5 行开始,到最后一行结束。在您的情况下,您可以设置OFFSET = -1而不是OFFSET = -5。
(( OFFSET = -5 )); (( N1 = $(cat pgen.c | wc -l) + OFFSET )); sed -n "$N1,\$p" thefile
此命令可以在一行中输入。
【讨论】: