使用Shell分析文件:while和if的组合

时间:2012-11-14 08:31:22

标签: shell

我有这样的文件:

1. blah zend blahblahblahblah

2. blahblahblah blahblahblah Zend

3. Zend blahblahblahblahblahblah blah

4. Yii blahblahblahblahblahblah

5.  blahblahblahblahblahblah  Yii

6. CI blahblahblahblahblahblahblahblah

7. blahblahblahblahblahblahblahblah CI

我想要的是:使用shell来读取这个文件的每一行,当该行包含Zend时,它会在行的末尾附加一个“a”,当行包含Yii时附加一个'b'和当该行包含CI时附加“c”。

我真的不知道如何在一个shell命令中执行此操作,是否有人可以轻视光线?

我设法一个接一个地做,LIke:

cat test2 | while read line; do echo "$line a" | grep Zend || echo $line; done  > test

我想我需要的是“while”和“if”的组合

4 个答案:

答案 0 :(得分:0)

您可以像这样使用sed

sed -e 's/\(^.*Zend.*$\)/\1 a/g;s/\(^.*Yii.*$\)/\1 b/g;s/\(^.*CI.*$\)/\1 c/g' file

答案 1 :(得分:0)

您可以使用awk

执行此操作
#!/bin/bash

awk '// {found=0}
     /Zend/ {print $0 " a"; found=1}
     /Yii/ {print $0 " b"; found=1}
     /CI/ {print $0 " c"; found=1}
     // {if (found==0) {print $0}}'

我假设你想在每一行的结尾与abc之间留一个空格。如果没有,您可以从脚本中删除它。

答案 2 :(得分:0)

while read line; do
  case $line in 
    *Zend*) suffix=" a" ;;
    *Yii*) suffix=" b" ;;
    *CI*) suffix=" c" ;;
    *) suffix="" ;;
  esac
  echo "$line$suffix"
done < filename

如果您想要不区分大小写的匹配并且您正在使用bash,请先添加shopt -s nocasematch

答案 3 :(得分:-1)

尝试awk;它以非常好的方式处理这样的情况。一个非常好的awk资源是GNU Awk user's Guide.

Awk可以在您的情况下使用如下:

cat test2 | awk '{ if ( $0 ~ ".*Zend.*" ) { print $0 "a" } else if ($0 ~ ".*Yii.*") { print $0 "b" } else if ($0 ~ ".*CI.*") { print $0 "c" } else { print $0 } }'