1

我有这样的文件:

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'并附加一个' c' 当该行包含 CI 时。

我真的不知道如何在一个 shell 命令中执行此操作,有人可以切碎吗?

不过,我设法一一做到了,例如:

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

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

4

4 回答 4

0

你可以sed这样使用:

sed -e 's/\(^.*Zend.*$\)/\1 a/g;s/\(^.*Yii.*$\)/\1 b/g;s/\(^.*CI.*$\)/\1 c/g' file
于 2012-11-14T08:52:41.430 回答
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}}'

我假设您想要在每行末尾和 , 或 之间留a一个b空格c。如果没有,您可以将其从脚本中删除。

于 2012-11-14T08:54:00.033 回答
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请先添加。

于 2012-11-14T11:36:30.177 回答
-1

试试 awk;它以非常好的方式处理这种情况。一个非常好的 awk 资源是GNU 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 } }'
于 2012-11-14T08:52:04.380 回答