从文件中删除前导空格

12

我的shell在.login文件中调用'fortune',以提供一则每日信息。但是,其中有些信息的开头有一个空格行,有些信息的开头有两个空格行,而有些则没有任何前导空白行,这让我感到困扰。

于是我开始编写自己的shell脚本包装'fortune',以便从输入中删除所有前导空格,同时不破坏实际消息的任何格式,因为它可能故意有空白行。

这似乎并不是一个简单的一行两分钟修复,当我阅读sed和grep的手册页时,我想问问我们这里的优秀赞助者们。


你能否明确展示一个样例 fortune 并指出哪些部分你想要更改,以及哪些部分是格式的一部分不应该更改。 - SiegeX
4个回答

21

使用和Dav相同的源:

# delete all leading blank lines at top of file
sed '/./,$!d'

来源: http://www.linuxhowtos.org/System/sedoneliner.htm?ref=news.rdf

此外,这是为什么它有效的原因:

逗号分隔了一个“操作范围”。sed 可以接受正则表达式来定义范围,因此 /./ 匹配第一行中的“任何内容”(.),$ 指定文件的结尾。因此,

  • /./,$匹配“从第一行非空白行到文件末尾”。
  • !然后反转该选择,使其有效成为“文件顶部的空行”。
  • d删除这些行。

太完美了!非常感谢!这个链接将来也会非常有用。 - Maarx
为了让这个程序能够处理我需要的约30K个Java文件,我运行了以下命令:"find . -name '*.java' | xargs -n 1 sed -e '/./,$!d' -i .bak" -- "-n 1" 对于sed的正确工作是必要的。 - Phil

2

1

怎么样:

sed "s/^ *//" < fortunefile

1
为什么被投票否决了?这是我对原帖请求的理解。 - SiegeX

0

我不确定你的幸运信息实际上是什么样子,但这里有一个插图。

$ string="       my message of the day"
$ echo $string
my message of the day
$ echo "$string"
       my message of the day

或者你可以使用awk

echo "${string}" | awk '{gsub(/^ +/,"")}1'

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