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

sku*_*003 11 sed awk text-processing

是否有一个命令可以让我编辑文件中的最后 n 行?我有几个文件,它们里面的行数都不同。但我想修改每个文件中的最后 n 行。目标是在最后 n 行中用分号替换逗号。但仅限于最后 n 行。

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

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

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

Jef*_*ler 13

用分号替换最后 n 行的逗号ed

n=3
ed -s input <<< '$-'$((n-1))$',$s/,/;/g\nwq'
Run Code Online (Sandbox Code Playgroud)

把它分开:

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

用分号替换最后 n 行的逗号sed

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

打破它:

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


Goh*_*ohu 7

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

tac file.txt | sed '1,50s/,/;/g' | tac
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 5

使用 GNUhead和类似 Bourne 的 shell:

n=20
{ head -n -"$n"; tr , ';'; } < file 1<> file
Run Code Online (Sandbox Code Playgroud)

我们正在覆盖文件本身。这是确定这里一个字节到字节的音译,但不一定会如果修改意味着改变文件的大小(在这种情况下,你要替换1<> file> other-file && mv other-file file的实例)。