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

私が欲しいのは、シェルを使用してこのファイルの各行を読み取ることです。行にZendが含まれている場合は、行の最後に「a」を追加し、行にYiiが含まれている場合は「b」を追加し、「」を追加します。行にCIが含まれている場合はc'。

1つのシェルコマンドでこれを行う方法が本当にわかりません。誰かが光を細かく切ることができますか?

私はそれを1つずつ行うことができました、LIke:

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

必要なものには「while」と「if」の組み合わせが必要だと思います

4

4 に答える 4

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 に答える
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}}'

各行の終わりとab、またはの間にスペースが必要だと思いますc。そうでない場合は、スクリプトから削除できます。

于 2012-11-14T08:54:00.033 に答える
-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 に答える