【问题标题】:Is it possible to use grep for the space character是否可以将 grep 用于空格字符
【发布时间】:2018-01-02 03:57:08
【问题描述】:

我有一个像这样的文本文件(example.txt):

100 this is a string
50  word
10   

(请注意,最后一行有尾随空格字符。)

当我在我的 shell 脚本中执行以下操作时:

cat example.txt | sed '1!d' | awk '{for (i=2; i < NF; i++) printf $i " "; print $NF}' - 返回这是一个字符串

cat example.txt | sed '2!d' | awk '{for (i=2; i < NF; i++) printf $i " "; print $NF}' - 返回单词

cat example.txt | sed '3!d' | awk '{for (i=2; i < NF; i++) printf $i " "; print $NF}' - 返回 10(不正确,应该是空格字符)

有什么方法可以在 bash 中使用 grep 来返回我要查找的结果吗?

【问题讨论】:

  • 那么您正在寻找的结果是什么?你只是想剥离领先的数字吗?最后一行的哪些空格字符是要输出的数据,哪些是输入文件格式的一部分,要忽略?
  • 是的,你可以这么说,我想去掉前导数字(或找到的第一个空格字符之前的任何字符)。文本文件的格式必须以数字开头,然后是空格,剩下的无关紧要(也可以是空格)。我的目标是删除数字和第一个空格,并将其余部分写入变量。但是,如果剩下的只包含空格字符,我就做不到

标签: bash grep space


【解决方案1】:

有什么方法可以在 bash 中使用 grep 来返回我要查找的结果吗?

嗯,grep 可以匹配空格字符。您必须引用它们以避免 shell 将它们解释为分隔符。但是grep 将输出整行或匹配的部分,具体取决于为其提供的选项,我认为这不会满足您的输出要求。

看起来您的输入格式可能使用固定的字段宽度,或者至少是固定宽度的第一个字段,并且您正试图删除该第一个字段。在那种的情况下,为什么不使用sed?例如,

cat example.txt | sed 's/^....//'

将删除每行的前四个字符。你也可以拼写那个

sed 's/^....//' example.txt

。如果您想将由十进制数字组成的行的可变长度头部剪切到第一个空格,那么那将是

sed 's/^[0-9]* //' example.txt

请注意,尽管这是您在 cmets 中所说的,但在您的第二个输入行的情况下,它会产生与您的 awk 示例不同的输出——它将输出一个前导空格:

 word

另请注意,您的基于awk 的方法将用单个空格替换行的保留部分中的多个相邻空格。这种行为也可以从sed 获得,但我倾向于认为它实际上并不是想要的。

【讨论】:

  • john,感谢您在这个问题上给我的启发,对于上述情况,我已经有了另一种解决方法
猜你喜欢
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
相关资源
最近更新 更多