我有这样的文件:
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”的组合
答案 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}}'
我假设你想在每一行的结尾与a
,b
或c
之间留一个空格。如果没有,您可以从脚本中删除它。
答案 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 } }'