Сценарий оболочки для удаления двойных кавычек в значении столбца

Кэширование https трудно настроить, извините. Необходимо создать локальный certficate CA, и настроить клиентские программы для принятия его. Я не знаю, какое программное обеспечение прокси необходимо было бы использовать для него.

Сквид не является большим для кэширования больших загрузок. Это не поддерживает частичные экземпляры, т.е. возобновление прерванных загрузок.

Polipo поддерживает частичные экземпляры, и я люблю его как персональный прокси. Это время от времени было немного ненадежно. В особенности это может пострадать, если у Вас есть старая dnsmasq реализация на Вашем домашнем маршрутизаторе, который запутывается одновременными запросами DNS для ipv4 и ipv6. Это не поддерживает https перехват/кэширование.

Надо надеяться, Ваше клиентское программное обеспечение уважает standand переменные среды как $http_proxy. Если Ваш дистрибутив поддерживает его, можно установить, например. http_proxy=http://localhost:8123/ в/etc/environment, и это будет установлено во время входа в систему pam_env. (debian пострадал от ошибки в некоторой недавней точке, которая отключила это, но я думаю, что она работает над моей текущей debian нестабильной машиной).

6
14.10.2015, 20:08
2 ответа

Очень простой вариант - использовать sed, как предлагает @Dani, если вы хотите удалить все двойные кавычки.

$ 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' добавляет кавычку до и после каждой трубы.

Надеюсь, это поможет.

EDIT: В соответствии с комментарием о разделителе труб, мы должны немного изменить команду

Пусть 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"

Надеюсь, это та обработка, которая вам нужна.

Дайте мне знать!

FINAL EDIT

Этот скрипт обрабатывает предоставленную вами входную строку, несколько раз включительно. Единственным ограничением является то, что все 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

Отсюда вы должны быть в состоянии заставить его работать для вашего конкретного случая.

16
27.01.2020, 20:21

Самый простой критерий для редактирования поля - "если в нем есть буквы".
Поля, содержащие только цифры (и некоторые символы .,- и т.д.), следует оставить в покое.
Этот простой скрипт 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
0
27.01.2020, 20:21

Теги

Похожие вопросы