使用sed如何仅删除第一行中的最后一个字符?

3
我该如何使用`sed`仅删除文件的第一行最后一个字符?

1
在编程中,给一些测试/尝试是一个好主意,这样解释也可以在上面,其他人会看到你不是要求代替他们的工作,而是需要帮助。 - NeronLeVelu
1
@blefeet 我认为这个问题并不算“过于宽泛”。它既没有太多的答案,也不需要长篇大论的回答。另一方面,这个问题可能可以通过谷歌搜索得到答案。 - Jotne
1
@bluefeet,由于之前的评论拼错了你的名字,我想发一条通知给你。 - ScottJShea
1
@Jotne 目前这篇帖子没有问题,标题是唯一带有问题的内容,其余只是要求解释,可能会导致多个答案或长时间的解释,以目前的写法来看,它不适合在该网站上发布。 - Taryn
@Sandey 我投票支持重新开放此问题,但除了其他人告诉你的之外,你还应该提供几行样本输入和期望输出。 - Ed Morton
@bluefeet,抱歉拼错了你的名字。只差一个投票就可以重新开放了。 - Jotne
1个回答

14

你可以例如使用这个:

sed '1 s/.$//' file

解释

  • 1 表示我们要执行操作的行。
  • 给定语法 s/text/replacement/,我们查找任何带有 . 后跟 $ 的字符,表示行末。因此,我们查找行末前的最后一个字符,并将其替换为 Nothing。也就是说,我们删除了该行的最后一个字符。

要编辑文件,您可以使用 -i.bak

测试

$ cat a
hello this is some text
and this is something else
$ sed '1 s/.$//' a
hello this is some tex
and this is something else

为了好玩,让我们看看如何用 awk 实现这个目标:

awk -v FS= -v OFS= 'NR==1{NF=NF-1}1' file

该代码设置了输入和输出字段分隔符 (FS, OFS) 为空(与BEGIN{FS=OFS=""}相同),因此每个字符都是一个字段。基于此,当记录为1时(在这种情况下,当我们在第一行时),将字段数(NF)减少,以便最后一个字符被“丢失”。然后,1 是一个真条件,使得 awk 执行其默认操作: {print $0}


1
无论问题简单还是困难,您总是给出完整的答案! - Kent
1
很难用sed变得更好,但解释是应该的 :-) - NeronLeVelu
1
NF=NF-1 可以写成 --NF,但我记得这只适用于某些 awk(例如不是 nawk?),要使用 awk 删除第一行的最后一个字符,你真正需要做的就是相当于 sed 命令的等效操作,即 awk 'NR==1{sub(/.$/,"")}1' file。赞一个 sed 命令和解释。 - Ed Morton
感谢您的评论@EdMorton。那么,当前的awk方法不是一个好的(或至少正确的)方法吗?我认为这有点过度杀伤力了,而sed(或其sub()等效)非常快速,但我猜想“玩弄”NF是否足够值得考虑 :) - fedorqui
1
调整NF是我个人从未考虑过的事情,也不确定它的副作用(它更像是调整字段还是调整记录?),而且它只适用于一些现代awk,所以我自己永远不会这样做,但你的情况可能不同。 - Ed Morton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接