2016-11-23 219 views
1

我写了一个程序,该程序应该将example.txt中的单词从最长写到最短。我不知道'^.{$v}$'应该如何让它工作?bash中的命令变量

#!/bin/bash 
v=30 

while [ $v -gt 0 ] ; do 
    grep -P '^.{$v}$' example.txt 
    v=$(($v - 1)) 
done 

我想:

  • ${v}
  • $v
  • "$v"

这是我的第一个问题,遗憾的任何错误:)

+1

第一个Q不坏,至少你已经试图解决你的问题。在未来(对于Q而言不是那么多),包含A.一小套样本数据非常有帮助,它涵盖了您期望处理的所有情况以及一个不会被处理的项目; B.该输入所需的输出,包括未得到处理的记录C.您的代码/当前输出/错误消息。 D.你的想法是为什么你的代码应该工作(我们将帮助你解决你对事情工作的理解)。祝你好运! – shellter

回答

1

使用:

grep -P "^.{$v}$" example.txt 
2

你在做什么不是你如何处理这个问题在shell中。阅读why-is-using-a-shell-loop-to-process-text-considered-bad-practice学习的一些问题,然后你这是怎么会真正做到你想在一个shell脚本做什么:

$ cat file 
now 
is 
the 
winter 
of 
our 
discontent 

$ awk -v OFS='\t' '{print length($0), NR, $0}' file | sort -k1rn -k2n | cut -f3- 
discontent 
winter 
now 
the 
our 
is 
of 

要理解那是什么做什么,看看AWK输出:

$ awk -v OFS='\t' '{print length($0), NR, $0}' file 
3  1  now 
2  2  is 
3  3  the 
6  4  winter 
2  5  of 
3  6  our 
10  7  discontent 

第一个数字是每行的长度,第二个数字是行出现在输入文件中,以便顺序的时候,才对其进行排序:

$ awk -v OFS='\t' '{print length($0), NR, $0}' file | sort -k1rn -k2n 
10  7  discontent 
6  4  winter 
3  1  now 
3  3  the 
3  6  our 
2  2  is 
2  5  of 

我们CA按-k1rn的长度排序(最长的第一个),但通过添加-k2n,保留输入文件中相同长度的行的顺序。然后cut只删除awk添加的sort使用的2个主要数字。