Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在unix中删除最后一行中的字符_Linux_Bash_Unix_Sed_Awk - Fatal编程技术网

Linux 在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

在unix中,如何从文件的最后一行中删除字符

例如,我有一个文件,其内容如下:

aaa
bbb*
ccc*
ddd*
eee
我的输出应该是:

aaa
bbb*
ccc*
ddd
eee

有什么想法吗?

vivim或任何编辑器打开文件,然后像你想要的那样用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
    会产生重新启动脚本的副作用
  • 仅当最后两行位于阵列空间中时,才会计算“替换”命令

如果vim是一个选项,那么这个问题根本不应该存在!如果OP在shell脚本中需要它呢?因为替换只在遇到最后一行时发生,所以更积极的可能是
sed'$!N$s/\(\n\)/\1/;PD'file
@potong:是的,这使它更加明确,但是对于这样一个简短的脚本,我更喜欢让命令最后运行。
aaa
bbb*
ccc*
ddd
eee