Bash脚本到stdout坚持重定向

时间:2018-04-17 13:12:14

标签: bash shell redirect sed

我的bash脚本如下:

#!/bin/bash
if [ ! -f "$1" ]; then
  exit
fi
while read line;do
  str1="[GAC]*T"
  num=$"(echo $line | tr -d -c 'T' | wc -m)"
  for((i=0;i<$num;i++))do
    echo $line | sed "s/$str1/&\n/" | head -n1 -q
    str1="${str1}[GAC]*T"
  done
  str1="[GAC]*T"
done < "$1

虽然它应该正常工作(取文件名输入并逐行打印,直到字母T和下一个字母T等),然后打印到终端。

输入:

GATTT
ATCGT

输出:

GAT
GATT
GATTT
AT
ATCGT

当我使用带有| tee outputfile的脚本时,输出文件是正确的但是当使用带有> outputfile的脚本时,终端挂起/被卡住并且没有完成。此外,它适用于bash -x scriptname inputfile > outputfile但仍与bash scriptname inputfile > outputfile一致。

2 个答案:

答案 0 :(得分:1)

我对原始脚本进行了修改,请尝试:

if [ ! -f "$1" ]; then                                               
  exit                                                                   
fi                                                                       
while IFS='' read -r line || [[ -n "$line" ]];do                         
  str1="[GAC]*T"                                                         
  num=$(echo $line | tr -d -c 'T' | wc -m)                               
  for((i=0;i<$num;i++));do                                               
    echo $line | sed "s/$str1/&\n/" | head -n1 -q                        
    str1="${str1}[GAC]*T"                                                
  done                                                                   
  str1="[GAC]*T"                                                         
done < "$1" 

输入:

GATTT                                                                    
ATCGT

此脚本输出:

GAT
GATT
GATTT
AT
ATCGT

对原始脚本所做的修改是:

  • while read line; do已更改为while IFS='' read -r line || [[ -n "$line" ]]; do。我这样做的原因在此解释:Read a file line by line assigning the value to a variable

  • num=$"(echo $line | tr -d -c 'T' | wc -m)"已更改为num=$(echo $line | tr -d -c 'T' | wc -m)

  • for((i=0;i<$num;i++))do已更改为for((i=0;i<$num;i++));do

  • done < "$1已更改为done < "$1"

现在你可以:./scriptname inputfile > outputfile

答案 1 :(得分:0)

尝试:

  axios.interceptors.response.use(
    response => response,
  error => {
    const {status} = error.response;
    if (status === 401 ) {
      store.dispatch('snackBar', snackbarObj)
    } 
   return Promise.reject(error);
  }
)

而不是你的脚本。

需要一些可选的非Ts,然后是至少一个T并在T之后插入换行符。

sed -r 's/([^T]*T+)/\1\n/g' gatc.txt > outputfile

对于多行,要删除最后的空行:

cat gatc.txt 
GATGATTGATTTATATCGT
sed -r 's/([^T]*T+)/\1\n/g' gatc.txt 
GAT
GATT
GATTT
AT
AT
CGT