SED:无论文件长度如何,都在最后七行上操作

时间:2011-01-23 21:43:19

标签: sed

无论文件长度如何,我都希望使用sed对文件的最后7行进行操作。

根据related question,这种类型的范围不起作用:$-6,$ {..commands..}

等同于什么?

5 个答案:

答案 0 :(得分:2)

tail -7的输出传输到sed。

tail -7 test.txt | sed -e "s/e/WWW/"

关于管道here.

的更多信息

答案 1 :(得分:1)

你可以从sed(1)切换到ed(1),命令大致相同。在这种情况下,命令 是相同的,除了对地址范围没有限制。

$ cat > fl7.ed
ed - $1 << \eof
1,7s/$/ (one of the first seven lines)/
$-6,$s/$/ (one of the last seven lines)/
w
q
eof
$ sh fl7.ed yourfile

答案 2 :(得分:0)

perl -lne 'END{print join$\,@a,"-",@b}push@a,$_ if@a<6;push@b,$_;shift@b if@b>7'

END{}区块,你可以做任何必要的事情; @a包含前6个,@b最后7行请求。

答案 3 :(得分:0)

这应该适合你:

sed '1{N;N;N;N;N};N;$s/foo/bar/g;P;D' inputfile

说明:

  • 1{N;N;N;N;N} - 当读取第一行时,用另外五行加载模式空间(此时总共为6行)
  • N - 追加另一行
  • $s/foo/bar/g - 当读取最后一行时,对模式空间的整个内容(文件的最后七行)执行一些操作。操作可能比此处显示的更复杂
  • P - 在模式空间的第一个换行符之前打印测试
  • D - 删除刚刚打印的文本并循环到脚本的开头(“追加另一行”步骤 - 跳过第一条指令,因为它只适用于文件的第一行)

答案 4 :(得分:0)

这可能对您有用:

sed ':a;1,6{$!N;ba};${s/foo/bar/g;q};N;D' file

说明:

  • 创建循环标签。 :a
  • 在模式空间(PS)中收集第1行到第6行。 1,6{$!N;ba}
  • 如果是最后一行,则处理PS并退出,因此打印出最后七行。 ${s/foo/bar/g;q}
  • 如果不是最后一行,请将下一行附加到PS。 N
  • 删除第一个换行符并开始新的循环而不读取新行。 D