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 = 用分号替换逗号。使用tac和sed将 file.txt 的最后 50 行中的每个逗号替换为分号的解决方案:
tac file.txt | sed '1,50s/,/;/g' | tac
Run Code Online (Sandbox Code Playgroud)
使用 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的实例)。