регулярное выражение grep, чтобы избежать совпадения точки с запятой в конце

bash-4.1$ cat file1
userD
user3
userA
user1
userB

bash-4.1$ cat file2
user3
userB
userX
user1
user7

bash-4.1$ awk 'NR==FNR{Arr[$0]++;next}!($0 in Arr){print FNR}' file1  file2
3
5
1
23.08.2017, 23:29
2 ответа

Я решил опубликовать резюме обсуждения 20+ -комментариев выше.

Одно из решений предоставил @don _crissti, который предложил команду:

$ grep -E '.*_DB([^;]*)$' <filename>

который производит вывод

init_DB(DB *database, char *params[])
prep_DB() {
FILE * load_DB(const char * exppath, const char * expfname)

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

$ grep -E '_DB\(.*\)$' <filename>
0
27.01.2020, 23:45

Предположим, что это исходный файл C с именем file.c.

Использованиеctags:

$ ctags file.c

Это создает файл с именемtags:

$ cat tags
init_DB file.c  /^init_DB(DB *database, char *params[])$/
load_DB file.c  /^FILE * load_DB(const char * exppath, const char * /
prep_DB file.c  /^prep_DB() {$/

Может использоваться с viили vimдля автоматического перехода к определениям функций.

Вы также можете разобрать этот файл с помощью cutиgrep:

$ cut -f 1 tags | grep '_DB$'
init_DB
load_DB
prep_DB

В системах Ubuntu установка ctagsфактически приведет к установке exuberant-ctags, что обеспечивает более подробный tagsвывод:

$ cat tags
!_TAG_FILE_FORMAT       2       /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED       1       /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR    Darren Hiebert  /dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME      Exuberant Ctags //
!_TAG_PROGRAM_URL       http://ctags.sourceforge.net    /official site/
!_TAG_PROGRAM_VERSION   5.9~svn20110310 //
init_DB file.c  /^init_DB(DB *database, char *params[])$/;"     f
load_DB file.c  /^FILE * load_DB(const char * exppath, const char * expfname)$/;"       f
prep_DB file.c  /^prep_DB() {$/;"       f

Здесь мы можем быть уверены, что получим определения функций только с помощью

$ awk '$NF == "f" && $1 ~ /_DB$/ { print $1 }' tags
init_DB
load_DB
prep_DB

Дело в том, что лучше использовать специализированный синтаксический анализатор языка C, чем пытаться учитывать все возможные стили программирования в awkскрипте или регулярном выражении с grep, который анализирует код C.

Вы также можете

$ ctags -x file.c
init_DB          function      3 file.c           init_DB(DB *database, char *params[])
load_DB          function     12 file.c           FILE * load_DB(const char * exppath, const char * expfname)
prep_DB          function      8 file.c           prep_DB() {

, а затем проанализируйте/отфильтруйте его так, как вам нужно. Номер — это номер строки определения. Все сводится к тому, что вы подразумеваете под «хочу найти».

1
27.01.2020, 23:45

Теги

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