有没有办法找到两个相邻的新行是否以某些单词开头?

时间:2013-05-31 11:53:42

标签: perl bash sed grep

说我有这样的文件:

+jaklfjdskalfjkdsaj
fkldsjafkljdkaljfsd
-jslakflkdsalfkdls;
+sdjafkdjsakfjdskal

我只想查找并计算此文件中以-开头的行后面紧跟着以+开头的行的次数。

规则:

  • 无外部脚本
  • 必须在bash脚本中完成
  • 必须内联

例如,我可以弄清楚如何在Python脚本中执行此操作,但我从未在Bash中做过这么广泛的事情。

有人可以帮帮我吗?我认为它最终会成为grepperl,或者可能是一个才华横溢的sed行 - 但这些是我还在学习的东西。

谢谢大家!

5 个答案:

答案 0 :(得分:8)

grep -A1 "^-" $file | grep "^+" | wc -l

第一个grep查找以-开头的所有行,而-A1也会导致它也在匹配后输出该行。

然后,我们为以+开头的任何行grep输出。逻辑值:

  1. 我们知道第一个grep的输出只是-XXX行和以下行
  2. 我们知道+xxx行不能也是-xxx
  3. 因此,任何+xxx行必须跟随行,并且应该计算,我们使用wc -l

答案 1 :(得分:6)

Perl很容易:

perl -lne '$c++ if $p and /^\+/; $p = /^-/ }{ print $c' FILE

答案 2 :(得分:1)

awk 单行:

awk -v FS='' '{x=x sprintf("%s", $1)}END{print gsub(/-\+/,"",x)}' file

e.g。

kent$  cat file
+jaklfjdskalfjkdsaj
fkldsjafkljdkaljfsd
-jslakflkdsalfkdls;
+sdjafkdjsakfjdskal
-
-
-
+
-
+
foo
+

kent$  awk -v FS='' '{x=x sprintf("%s", $1)}END{print gsub(/-\+/,"",x)}' file
3

答案 3 :(得分:1)

另一个Perl示例。不像choroba那样简洁,但在工作方式上更透明:

perl -e'while (<>) { $last = $cur; $cur = $_; print $last, $cur if substr($last, 0, 1) eq "-" && substr($cur, 0, 1) eq "+" }' < infile

输出:

-jslakflkdsalfkdls;
+sdjafkdjsakfjdskal

答案 4 :(得分:1)

Pure bash:

unset c p
while read line ; do
    [[ $line == +* && $p == 0 ]] && (( c++ ))
    [[ $line == -* ]]
    p=$?
done < FILE
echo $c