如何编辑文件中的最后 n 行?

如何编辑文件中的最后 n 行?

是否有命令允许我编辑文件中的最后 n 行?我有几个文件,其中的行数都不同。但我想修改每个文件中的最后 n 行。目标是用分号替换最后 n 行中的逗号。但仅限于最后 n 行。

我不想删除任何行,我只想用每个文件最后 n 行中的分号替换每个逗号。

使用 sed 命令,我可以用此命令替换最后一行。正如这里所描述的: 如何删除文件最后一行的文本?

但这只能让我修改最后一行,而不是最后 n 行。

答案1

要将最后 n 行中的逗号替换为分号ed

n=3
ed -s input <<< '$-'$((n-1))$',$s/,/;/g\nwq'

将其分开:

  • ed -s= 静默运行 ed (不报告末尾写入的字节)
  • '$-'= 从文件末尾 ( $) 减去 ...
  • $((n-1))= n-1 行...
  • $' ... '= 引用命令的其余部分以保护它免受 shell 的影响)
  • ,$s/,/;/g= ... 直到文件末尾 ( ,$),搜索所有逗号并将其替换为分号。
  • \nwq= 结束上一条命令,然后保存并退出

要将最后 n 行中的逗号替换为分号sed

n=3
sed -i "$(( $(wc -l < input) - n + 1)),\$s/,/;/g" input

把它分开:

  • -i=“就地”编辑文件
  • $(( ... ))= 做一些数学计算:
  • $( wc -l < input)= 获取文件中的行数
  • -n + 1= 向后走 n-1 行
  • ,\$= 从 n-1 行直到文件末尾:
  • s/,/;/g= 将逗号替换为分号。

答案2

使用tacsed将 file.txt 最后 50 行中的每个逗号替换为分号的解决方案:

tac file.txt | sed '1,50s/,/;/g' | tac

答案3

使用 GNUhead和类似 Bourne 的 shell:

n=20
{ head -n -"$n"; tr , ';'; } < file 1<> file

我们正在覆盖文件本身。对于字节到字节的音译来说这是可以的,但如果修改意味着更改文件的大小(在这种情况下,您需要例如替换1<> file为) ,则不一定。> other-file && mv other-file file

答案4

使用tail并通过管道连接到 sed:

tail -n 20 file | sed 's/,/;/g'

这适用于文件的最后 20 行。如果您想让您直接访问文件,请使用:

tail -n 20 file | sed -i 's/,/;/g'

相关内容