Linux 在unix中删除最后一行中的字符
在unix中,如何从文件的最后一行中删除字符 例如,我有一个文件,其内容如下:Linux 在unix中删除最后一行中的字符,linux,bash,unix,sed,awk,Linux,Bash,Unix,Sed,Awk,在unix中,如何从文件的最后一行中删除字符 例如,我有一个文件,其内容如下: aaa bbb* ccc* ddd* eee 我的输出应该是: aaa bbb* ccc* ddd eee 有什么想法吗?用vi或vim或任何编辑器打开文件,然后像你想要的那样用awk直接编辑文件: awk '{a[NR]=$0}END{for(i=1;i<=NR;i++){if(i==NR-1)sub(/.$/,"",a[i]);print a[i]}}' file awk '{if(f>1)pr
aaa
bbb*
ccc*
ddd*
eee
我的输出应该是:
aaa
bbb*
ccc*
ddd
eee
有什么想法吗?用vi或vim或任何编辑器打开文件,然后像你想要的那样用awk直接编辑文件:
awk '{a[NR]=$0}END{for(i=1;i<=NR;i++){if(i==NR-1)sub(/.$/,"",a[i]);print a[i]}}' file
awk '{if(f>1)print p;p=l;f++;l=$0}END{sub(/.$/,"",p);print p;print l}' file
脑海中浮现出三种普遍的方法 使用
wc-l文件
获取行数:
awk 'NR==n-1{sub(/.$/,"")}1' n=$(wc -l file)
aaa
bbb*
ccc*
ddd
eee
分析文件两次:
awk 'FNR==NR{n++;next}FNR==n-1{sub(/.$/,"")}1' file file
aaa
bbb*
ccc*
ddd
eee
在处理前后反转文件:
tac file | sed '2s/.$//' | tac
aaa
bbb*
ccc*
ddd
eee
再次使用
ed
的好时机,一次:
简短版本:
{ echo '$-1s/.$//' ; echo "w" ; } | ed file_to_modify.txt >/dev/null
带有一些“调试信息”的版本^
简而言之:ed
与vi非常接近,但一次只能工作一行。。。
我只是告诉它在第n-1行($=ed中的最后一行,并且$-1=最后一行-1)上的“s/$/”(将一行的最后一个字符替换为零)在使用sed的单次过程中执行此操作的一般方法是使用滑动窗口,类似于中所述 由于您只对倒数第二行的替换感兴趣,因此不需要保留空间。在这种情况下,一个
N
就足够了:
sed 'N; $! { P; D; }; s/.\n/\n/'
或作为BSD sed兼容脚本:
sed 'N; $! { P; D; }; s/.\n/\
/'
输出:
aaa
bbb*
ccc*
ddd
eee
解释
命令向图案空间添加第二行N
- <代码>$代码>块在未到达最后一行时进行计算
打印第一行模式空间并将其删除。如果模式空间不为空,则{P;D;}
会产生重新启动脚本的副作用D
- 仅当最后两行位于阵列空间中时,才会计算“替换”命令
sed'$!N$s/\(\n\)/\1/;PD'file
@potong:是的,这使它更加明确,但是对于这样一个简短的脚本,我更喜欢让命令最后运行。
aaa
bbb*
ccc*
ddd
eee