用于删除列值中的双引号的 Shell 脚本

用于删除列值中的双引号的 Shell 脚本

我有一个包含 10 列的输入文本文件,在处理该文件时,在中间一列中,我得到了这种类型的数据。我要求列值如下:

输入列值:“这是我的新程序:“Hello World””

必需的列值:“这是我的新程序:Hello World”。

请帮助我处理任何 Unix shell 脚本或命令。非常感谢您的宝贵时间并提前致谢。

答案1

如果您想删除所有双引号,一个非常简单的选择是使用 @Dani 建议的 sed 。

$ echo "This is my program \"Hello World\"" | sed 's/"//g'

This is my program Hello World

不过,如果您只想删除内部引号,我建议删除所有引号并在开头添加一个,在末尾添加一个,如下所示。

假设我们有一个文件sample.txt,其中包含以下内容:

$ cat sample.txt

"This is the "First" Line"
"This is the "Second" Line"
"This is the "Third" Line"

然后,如果您只想删除内部引号,我建议如下:

$ 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"

解释:

sed 's/"//g'删除每行上的所有双引号

sed 's/^/"/'在每行的开头添加双引号

sed 's/$/"/'在每行末尾添加双引号

sed 's/|/"|"/g'在每个管道之前和之后添加一个引号。

希望这可以帮助。

编辑:根据管道分隔符注释,我们必须稍微更改命令

令sample.txt为:

$ cat sample.txt

"This is the "First" column"|"This is the "Second" column"|"This is the "Third" column"

然后,为管道添加替换命令给我们最终的解决方案。

$ 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"

脚本选项

使用此sample.txt 文件

$ cat sample.txt
"This is the "first" column"|12345|"This is the "second" column"|67890|"This is the "third" column"

还有这个脚本

#!/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

你会得到这个:

$ ./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"

我希望这是您需要的处理。

让我知道!

最终编辑

该脚本处理您提供的输入行,其中包括多次。唯一的限制是所有 20 列必须位于同一行。

#!/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

从这里开始,您必须能够使其适合您的特定情况。

答案2

编辑字段的最简单标准是“是否有字母”。
仅包含数字(以及一些符号 .,- 等)的字段应保留。
这个简单的 awk 脚本可以完成这项工作:

#!/bin/bash

awk -v FS='|' -v OFS='|' '{
for ( i=1; i<=NF; i++) {
    if ( $i ~ /[a-zA-Z]/ ) {
        gsub(/["]/,"",$i); $i="\"" $i "\""    # Remove dquotes, add them back.
    }
} }1' input.txt >output.txt

相关内容