![如何获取索引指定的两个单词之间的文本?](https://linux22.com/image/99546/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E7%B4%A2%E5%BC%95%E6%8C%87%E5%AE%9A%E7%9A%84%E4%B8%A4%E4%B8%AA%E5%8D%95%E8%AF%8D%E4%B9%8B%E9%97%B4%E7%9A%84%E6%96%87%E6%9C%AC%EF%BC%9F.png)
使用 awk,我可以打印给定索引的单词,如下所示。
$ echo "The quick brown fox jumps over the lazy dog" | awk '{print $3, $7}'
brown the
但我也想获取指定单词“brown”和“the”之间的文本。所以我希望输出是这样的。
brown fox jumps over the
没有必要专门使用 awk,但是单词的索引和标记化应该与 awk 相匹配,以与我的 shell 脚本中使用 awk 的其他部分保持一致。
我考虑过打印从第一个索引到最后一个索引的单词,但这不会保留单词之间的空格。
为了以复杂但更准确的方式表达,我想获取从索引指定的某个单词的开头开始到另一个索引指定的另一个单词的结尾结束的文本。我怎样才能实现这一点(最好没有 bash 循环)?
答案1
通过gawk
,您可以使用该split()
函数来确定字段及其分隔符:
$ echo "The quick brown fox jumps over the lazy dog" | awk '{ split($0, a, "\\s+", s); for (i = 3; i <= 7 && i <= length(a); i++) printf "%s%s", a[i], (i < 7 ? s[i] : "\n") }'
brown fox jumps over the
答案2
和perl
$ echo "The quick brown fox jumps over the lazy dog" | perl -F'(\h+)' -lane 'print @F[4..12]'
brown fox jumps over the
-F'(\h+)'
按空格/制表符分割,也保存分隔符print @F[4..12]
打印所需的索引。perl
数组索引以 开头,0
并且还必须考虑分隔符。一个简单的规则是减 1 再乘以 2。因此 (3-1)*2=4 和 (7-1)*2=12