Заменить значения в ключе спецификаций строкой - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть текстовый файл, в котором некоторые строки имеют вид:

some text key1="value1" key2="value2",text_to_copy_1 
some text
some text key1="value3" key2="value4",text_to_copy_2
some text
...

И я буду sh, чтобы заменить значения в key1 на text_to_copy_X. Итак, я могу получить что-то вроде:

some text key1="text_to_copy_1" key2="value2",text_to_copy_1 
some text
some text key1="text_to_copy_2" key2="value4",text_to_copy_2
some text
...

Как я могу обработать этот файл в bash (предпочтительно) или python? ИНФОРМАЦИЯ: text_to_copy_X заканчивается окончательным пробелом, который я не хочу рассматривать. Спасибо

Ответы [ 3 ]

0 голосов
/ 24 февраля 2020
awk -F'"' '$2!="" {print $1 "\042" substr($5,2) "\042" $3 "\042" $4 "\042" $5}
           $2=="" {print}' <(sed 's| *$||' input)

Сначала sed удаляет все конечные пробелы из вашего файла input, поскольку вы не хотите их рассматривать.

Затем awk продолжает этот результат, используя " в качестве разделителя.

0 голосов
/ 24 февраля 2020

С помощью sed с флагом -E для использования ERE (например, GNU sed или OSX / BSD sed):

$ sed -E 's/(key1=")[^"]*(".*,(.*[^[:space:]]))/\1\3\2/' file
some text key1="text_to_copy_1" key2="value2",text_to_copy_1
some text
some text key1="text_to_copy_2" key2="value4",text_to_copy_2
some text
0 голосов
/ 24 февраля 2020

Вы можете достичь этого с sed

➜  ~  cat text
some text
some text key1="value3" key2="value4",text_to_copy_2
some text key1="value3" key2="value4",text_to_copy_2
some text key1="value3" key2="value4",text_to_copy_2
some text key1="value3" key2="value4",text_to_copy_2
some text
$>   sed  -E "s/key1=\"[^ ]+\"(.+),(.+)((\ )$)?/key=\"\2\"\1,\2/" text
some text
some text key="text_to_copy_2" key2="value4",text_to_copy_2
some text key="text_to_copy_23" key2="value4",text_to_copy_23
some text key="text_to_copy_4" key2="value4",text_to_copy_4
some text key="text_to_copy_2" key2="value4",text_to_copy_2
some text
...