使用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出现在同一行的可能性有多大?如果是,是否要附加多个字母?