Uma opção muito simples é usar sed como @Dani propõe se você quiser remover todas aspas duplas.
$ echo "This is my program \"Hello World\"" | sed 's/"//g'
This is my program Hello World
No entanto, se você quiser remover apenas as aspas internas, sugiro remover todas as citações e adicionar uma no início e uma no final da seguinte forma.
Digamos que temos um arquivo sample.txt com estes conteúdos:
$ cat sample.txt
"This is the "First" Line"
"This is the "Second" Line"
"This is the "Third" Line"
Então, se você quiser remover apenas as aspas internas, sugiro o seguinte:
$ cat sample.txt | sed 's/"//g' | sed 's/^/"/' |sed 's/$/"/'
"This is the First Line"
"This is the Second Line"
"This is the Third Line"
Explicação:
sed 's / "// g' remove todas as aspas duplas em cada linha
sed 's / ^ / "/' adiciona um aspas no início de cada linha
sed / $ / "/ ' adiciona um aspas no final de cada linha
sed 's / | / "|" / g' adiciona uma cotação antes e depois de cada pipe.
Espero que isso ajude.
EDIT : De acordo com o comentário do separador de pipe, temos que alterar ligeiramente o comando
Deixe o exemplo.txt ser:
$ cat sample.txt
"This is the "First" column"|"This is the "Second" column"|"This is the "Third" column"
Em seguida, adicionar um comando replacer para o pipe nos fornece a solução final.
$ cat sample.txt | sed 's/"//g' | sed 's/^/"/' |sed 's/$/"/' | sed 's/|/"|"/g'
"This is the First column"|"This is the Second column"|"This is the Third column"
A opção de script
Usando este arquivo sample.txt
$ cat sample.txt
"This is the "first" column"|12345|"This is the "second" column"|67890|"This is the "third" column"
E esse script
#!/bin/ksh
counter=1
column="initialized"
result=""
while [[ "$column" != "" ]]
do
eval "column=$(cat sample.txt | cut -d"|" -f$counter)"
eval "text=$(cat sample.txt | cut -d"|" -f$counter | grep '"')"
if [[ "$column" = "$text" && -n "$column" ]]
then
if [[ "$result" = "" ]]
then
result="_2quotehere_${column}_2quotehere_"
else
result="${result}|_2quotehere_${column}_2quotehere_"
fi
else
if [[ -n "$column" ]]
then
if [[ "$result" = "" ]]
then
result="${column}"
else
result="${result}|${column}"
fi
fi
fi
echo $result | sed 's/_2quotehere_/"/g' > output.txt
(( counter+=1 ))
done
cat output.txt
exit 0
Você receberá isto:
$ ./process.sh
"This is the first column"|12345|"This is the second column"|67890|"This is the third column"
$ cat output.txt
"This is the first column"|12345|"This is the second column"|67890|"This is the third column"
Espero que este seja o processamento de que você precisa.
Me avise!
EDIÇÃO FINAL
Este script processa a linha de entrada que você forneceu, várias vezes incluída. A única restrição é que todas as 20 colunas DEVEM ESTAR NA mesma linha.
#!/bin/ksh
rm output.txt > /dev/null 2>&1
column="initialized"
result=""
lineCounter=1
while read line
do
print "LINE $lineCounter: $line"
counter=1
while [[ ${counter} -le 20 ]]
do
eval 'column=$(print ${line} | cut -d"|" -f$counter)'
eval 'text=$(print ${line} | cut -d"|" -f$counter | grep \")'
print "LINE ${lineCounter} COLUMN ${counter}: $column"
if [[ "$column" = "$text" && -n ${column} ]]
then
if [[ "$result" = "" ]]
then
result="_2quotehere_$(echo ${column} | sed 's/\"//g')_2quotehere_"
else
result="${result}|_2quotehere_$( echo ${column} | sed 's/\"//g')_2quotehere_"
fi
else
if [[ "$result" = "" ]]
then
result=${column}
else
result="${result}|${column}"
fi
fi
(( counter+=1 ))
done
(( lineCounter+=1 ))
echo -e $result | sed 's/_2quotehere_/"/g' >> output.txt
result=""
done < input.txt
print "OUTPUT CONTENTS:"
cat output.txt
exit 0
A partir daqui, você deve conseguir que funcione para o seu caso em particular.