Как выявить значение шаблона, которого нет в комментарии (другой шаблон) - PullRequest
0 голосов
/ 30 июня 2019

Извлечь «значение =» только из части без комментариев

См. Ниже выражение sed, которое также получает значение из закомментированного кода

Я пытался с grep, но это также не работает

#!/bin/sh
#set -x

FILE="/tmp/comment.txt"
create_file () {
echo "/*" > $FILE
echo "this is a multi" >> $FILE
echo "line with" >> $FILE
echo "var=20" >> $FILE
echo "and ending the comment */" >> $FILE
echo "var=15" >> $FILE # line after comment
}

create_file
cat $FILE
# This sed should extract only from var=15 which is not part of
# comments, how to do that?
# output should be only 15, instead of "20 and 15"
sed -n "s/\(var=\)\([0-9]*\)/\2/p" $FILE

Фактический:

/*
this is a multi
line with
var=20
and ending the comment */
var=15
20
15

Ожидаемое:

/*
this is a multi
line with
var=20
and ending the comment */
var=15
15

Ответы [ 2 ]

1 голос
/ 30 июня 2019

Кажется, это работает:

sed -n -e:a -e'/\*\//d;/\/\*/{N;ba
};s/^var=//p'

Легкая часть - это извлечение значения из строки;самая трудная часть - сначала удалить комментарий.Грубый перевод: если есть */, то удалите все;в противном случае, если есть /*, прочитайте также следующую строку и начните сначала;в противном случае, если строка начинается с «var =», удалите эту часть и напечатайте остаток.

Примечание 1: в вашей версии sed раздражающий разрыв строки может не потребоваться.
Примечание 2: Советуюпроверить это в командной строке, прежде чем пытаться выполнить это из скрипта.

0 голосов
/ 30 июня 2019

Это дешевый и веселый способ удаления комментариев, как вы показали, используя GNU awk для мультисимвольных RS:

$ awk -v RS='[*]/' -v ORS= '{sub("/[*].*","")}1' file

var=15

Он будет отбрасывать комментарии независимо от того, где они начинаются / останавливаютсякаждая строка:

$ cat file
here's some text /* here's a comment */ and more text /* bleh */and more /*
this is a multi
line with
ending here */ and more
var=20/*
and ending the comment */
/* commented */ var=15

$ awk -v RS='[*]/' -v ORS= '{sub("/[*].*","")} 1' file
here's some text  and more text and more  and more
var=20
 var=15

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

Вы можете передать это по своему усмотрениюполучить значение var.Если это не все, что вам нужно, тогда получите / используйте парсер для любого языка, на котором написан ваш закомментированный код, например, см. https://stackoverflow.com/a/13062682/1745001 для C / C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...