【发布时间】:2021-02-04 21:09:55
【问题描述】:
我有这个输入文件
gb|KY798440.1|
gb|KY842329.1|
MG082893.1
MG173246.1
我想获取“|”之间的所有字符如果没有“|”,则为整行。这是一个期望的输出,看起来像
KY798440.1
KY842329.1
MG082893.1
MG173246.1
我写道:
while IFS= read -r line; do
if [[ $line == *\|* ]] ; then
sed 's/.*\|\(.*\)\|.*/\1/' <<< $line >> output_file
else echo $line >> output_file
fi
done < input_file
这给了我
empty line
empty line
MG082893.1
MG173246.1
(注意:empty line 表示实际的空行 - 它实际上并不写“空行”)
sed 命令适用于单个示例(即sed 's/.*\|\(.*\)\|.*/\1/' <<< "gb|KY842329.1|" 输出KY842329.1),但在循环中它只执行一行返回。 else echo $line >> output_file 似乎有效。
【问题讨论】:
-
为什么要使用 while/read 循环而不是让 sed 处理文件?
标签: bash sed while-loop