我想解析一个命令的stdout并在一行匹配时运行一个命令。例如,cat cities.txt
的输出是
paris
amsterdam
munich
berlin
london
brussels
我想回复同一个列表,但是对任何以字母b开头的城市运行命令。
cat cities.txt | <command here ... echo $city starts with b>
应输出类似
的内容paris
amsterdam
munich
berlin
berlin starts with b
london
brussels
brussels starts with b
答案 0 :(得分:2)
一个简单的bash
脚本: -
#!/bin/bash
while IFS= read -r line
do
[[ $line == b* ]] && echo -e "$line\n$line starts with b" || echo "$line"
done <file
运行脚本会产生
$ bash script.sh
paris
amsterdam
munich
berlin
berlin starts with b
london
brussels
brussels starts with b
步骤: -
<(file)
进程替换完成 echo
具有-e
标记,可以解释特殊字符\n
。
您可以为匹配行运行一些其他命令,方法是在匹配它们的echo
部分之后替换&&
,并在||
条件之后替换不匹配的行。我已经使用伪命令名cmd_for_matching_lines
和cmd_for_non_matching_lines
演示了相同的内容。
#!/bin/bash
while IFS= read -r line
do
[[ $line == b* ]] && cmd_for_matching_lines "$line" || cmd_for_non_matching_lines "$line"
done <file
答案 1 :(得分:2)
便携式解决方案,没有诸如[[ ]]
之类的基本原理,我将其写为
#!/bin/sh
while read city; do
case $city in
(b*) echo $city starts with b;;
esac
done < cities.txt
请注意,如何将其扩展为不区分大小写(请改用([Bb]*)
)并使用其他首字母的测试进行扩充。