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

使用Shell分析文件:while和if的组合,shell,Shell,我有这样的文件: 1. blah zend blahblahblahblah 2. blahblahblah blahblahblah Zend 3. Zend blahblahblahblahblahblah blah 4. Yii blahblahblahblahblahblah 5. blahblahblahblahblahblah Yii 6. CI blahblahblahblahblahblahblahblah 7. blahblahblahblahblahblahb

我有这样的文件:

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命令中做到这一点,有人能切碎一盏灯吗

但我还是一个接一个地做了,比如:

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

我想我需要的是“while”和“if”的组合;它以一种非常好的方式处理这样的情况。一个非常好的awk资源是

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 } }'

您可以像这样使用
sed

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

您可以使用
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}}'
我假设您希望在每行末尾和
a
b
c
之间留一个空格。如果没有,您可以从脚本中删除它。

同时读取行;做
while read line; do
  case $line in 
    *Zend*) suffix=" a" ;;
    *Yii*) suffix=" b" ;;
    *CI*) suffix=" c" ;;
    *) suffix="" ;;
  esac
  echo "$line$suffix"
done < filename
案例$line in *Zend*)后缀=“a”;; *Yii*)后缀=“b”;; *CI*)后缀=“c”;; *)后缀=”;; 以撒 回显“$line$后缀” 完成<文件名

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

-1此答案不会打印不包含任何这些模式的行。编辑此选项可更正不打印不包含该模式的行的问题。在同一时间得到-1分!:(还有一个tgubg RS,如果我希望“Zend”或其他关键字不区分大小写,那么如果有一个字符串“Zend”,也会添加一个“The pattern in quotes is regular expression.这样我们就可以将。*Zend.*替换为。*[Zz]结束。*Zend、Yii或CI出现在同一行的可能性有多大?如果是,是否要附加多个字母?