Найти конкретную строку из текстового файла, используя два шаблона, а затем заменить переменную строку в этой строке - PullRequest
0 голосов
/ 18 апреля 2019

У меня большой текстовый файл (myfile.txt), где ровно для одной строки я пытаюсь заменить значение «0,9999999999» другим числом, скажем, «0,111111111».

expression "if((CONDITION1==1),0.999999999,CATEGORY1)"

Линия может быть однозначно идентифицирована путем поиска строки как перед ней, так и за ней (должно быть и вместе, или шаблон не уникален), или в этом случае

'expression "if((CONDITION1==1),'
and
',CATEGORY1)"'

После исследования нескольких других постов я обнаружил, что в моем случае сложной задачей является

  1. , идентифицирующая конкретную строку по нескольким шаблонам, и
  2. , заменяющая строку, котораяпоиск невозможен сам по себе (поскольку он может измениться)

Первая проблема, которую я вижу, была решена в других сообщениях, но я озадачен второй.

Iпопробовал несколько разных способов, но ни один из них не дает нужную вещь, самый близкий, который я получил:

sed -n '/if((CONDITION1==1).CATEGORY1)/{ s/\,*\,/\,0.111111111\,/p }' myfile.txt

Где я пытаюсь идентифицировать строки, просматривая часть строк префикса и суффикса,и затем пытаюсь заменить все между двумя запятыми и включая их.

Мои вопросы:

  1. что я делаю не так?
  2. Является ли sed лучшим инструментом для этой задачи, или awk или perl лучше?Спасибо.

=============== РЕДАКТИРОВАТЬ ==============

Я обновилмой код основан на версии @Ed, чтобы можно было прочитать значение из переменной, извлеченной из этого файла, во время выполнения кода на основе ввода.Надеюсь, это кому-нибудь поможет позже:

#test.sh
month= $1
VAL= $(cat data_$month.dat | awk 'NR==2') 
echo "VAL is:" $VAL
sed -i 's/\(expression "if((CONDITION1==1),\)[^,]*\(,CATEGORY1)"\)/\1'"${VAL}"'\2/' file

Ответы [ 2 ]

1 голос
/ 19 апреля 2019
$ sed 's/\(expression "if((CONDITION1==1),\)[^,]*\(,CATEGORY1)"\)/\10.111111111\2/' file
expression "if((CONDITION1==1),0.111111111,CATEGORY1)"

Вот пример того, почему часть, которую вы не захватываете, должна быть [^,]* вместо .*:

$ cat file
expression "if((CONDITION1==1),0.999999999,CATEGORY1)"  # this is ",CATEGORY1)"
expression "if((CONDITION1==1),0.999999999,FOO)"        # this is not ",CATEGORY1)"

$ sed 's/\(expression "if((CONDITION1==1),\)[^,]*\(,CATEGORY1)"\)/\10.111111111\2/' file
expression "if((CONDITION1==1),0.111111111,CATEGORY1)"  # this is ",CATEGORY1)"
expression "if((CONDITION1==1),0.999999999,FOO)"        # this is not ",CATEGORY1)"

$ sed 's/\(expression "if((CONDITION1==1),\).*\(,CATEGORY1)"\)/\10.111111111\2/' file
expression "if((CONDITION1==1),0.111111111,CATEGORY1)"
expression "if((CONDITION1==1),0.111111111,CATEGORY1)"
0 голосов
/ 19 апреля 2019

если ваши данные в файле 'd', попробуйте gnu sed:

sed -E 'h;s/expression "if\(\(CONDITION1==1\),([0-9.]+),CATEGORY1\)"/\1/;s/9/1/g;G;s/(.+)\n([^,]+,)[^,]+(,.+)/\2\1\3/' d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...