我对 Shell 脚本还很陌生,我对文件解析有一个小疑问。
因此,这就是我想做的事情:
我运行 svn merge 命令,并生成冲突文件,我的冲突文件存储为 conflicts.txt
我想要做的是逐行读取这个文件并解析一行来匹配一些关键字。
例如文件中的其中一行如下所示:
C Client/Game/src/test/test.php
现在我想解析这一行并搜索关键字test
,如果找到它我想对它执行一些操作,例如以退出状态 2、3 等中止。
例如,我想遍历一个名为“FILENAME”的文本文件,它看起来像这样
30 '!' C Client/test.js
31 '!' C Client/test2.js
32 '!' C Client/test3.js
`
我正在做的是使用 while 循环和 cat 命令对文件进行 cat 操作
cat $FILENAME | while read LINE do echo $LINE done
这里我只是打印了这一行,我想知道如何在这一行中搜索关键字,如果我找到了这个关键字,我该如何对其执行一些操作,比如以状态 1 退出
您能否建议一些方法来做到这一点?
答案1
有很多方法可以做到这一点,具体取决于您的需要。
只需打印包含关键字的所有行
test
:grep test file.txt
相同,但针对多个关键字。创建一个包含所有关键字的文件,每行一个,然后运行
grep -f keywords.txt file.txt
逐行处理文件,如果发现行则退出
while read line; do echo $line | grep test && break; done < file.txt
如果行匹配,则以状态 1 退出。不幸的是,如果我没记错的话(不是 100% 确定),bash 只允许您在函数中设置返回值。因此,要获取退出状态,您需要使用其他方法。例如 Perl:
perl -ne '/test/ && exit(1)' file.txt
虽然您无法设置退出值,但您仍然可以使用 bash 执行类似操作。最后运行的命令的退出值始终保存在 bash
$?
中,这意味着您可以测试该值$?
并采取相应措施:while read line; do let c++; echo $line | grep test >/dev/null; if [[ $? == 0 ]] ; then echo Match for line $c : $line; else echo No match for line $c; fi done < file.txt
答案2
最简单的方法就是根本不逐行解析文件。
grep -q 'keyphrase' filename && exit <exitcode>
答案3
$ function some_action {
echo found keyword
}
$ if grep -q -m1 -e 'test3' < input;
then
some_action
fi
found keyword
grep 选项:
- -q:安静;不打印匹配项
- -m1:匹配一次后退出
- -e:表达式(关键字)
例如:
$ grep . input
30 '!' C Client/test.js
31 '!' C Client/test2.js
32 '!' C Client/test3.js
$ if grep -q -m1 -e 'test3' < input; then some_action ; fi
found keyword