是否有命令允许我编辑文件中的最后 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
使用tac
和sed
将 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'