我有一个像这样的文本文件(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来返回我想要的结果吗?
答案 0 :(得分:0)
有什么方法可以在bash中使用grep来返回我想要的结果吗?
好吧,grep
可以匹配空格字符。你必须引用它们以避免shell将它们解释为分隔符。但grep
将输出整行或匹配的部分,具体取决于给定的选项,我认为这不会满足您的输出要求。
看起来您的输入格式可能使用固定的字段宽度,或者至少是固定宽度的第一个字段,并且您尝试删除第一个字段。在那个的情况下,为什么不使用sed
?例如,
cat example.txt | sed 's/^....//'
将删除每行的前四个字符。你也可以拼写
sed 's/^....//' example.txt
。如果你想要切割由十进制数字组成的直线到第一个空格的可变长度头部,那么这将是
sed 's/^[0-9]* //' example.txt
请注意,虽然这就是您在评论中所说的内容,但在第二个输入行的情况下,它会产生与awk
示例不同的输出 - 它将输出一个前导空格:
word
另请注意,基于awk
的方法将使用单个空格替换行的保留部分中的多个相邻空格。这种行为也可以从sed
获得,但我倾向于认为它实际上并不需要。