while循环内的sed命令不会写入输出

时间:2020-10-21 21:55:11

标签: bash sed while-loop

我有这个输入文件

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似乎有效。

2 个答案:

答案 0 :(得分:2)

裸机:

$ sed 's/^[^|]*|\||[^|]*$//g' file

输出:

KY798440.1
KY842329.1
MG082893.1
MG173246.1

答案 1 :(得分:0)

你可以做

sed '/|/s/[^|]*|\([^|]*\)|.*/\1/' input

awk 'NF>1 {print $2} NF < 2 { print $1}' FS=\| input

sed -e 's/[^|]*|//' -e 's/|.*//' input