sed -ie '/string1/!b' -e '/string2/d' file.txt
При этом удаляются строки, содержащие как строка1
, так и строка2
независимо от порядка (могут даже перекрываться, как при просмотре для foobar
в barbaz
в строке, содержащей foobarbaz
).
-i
выше является расширением GNU. Другое решение, специфичное для GNU:
awk -i inplace '!(/string1/ && /string2/)' file.txt
Возможно, вы использовали бы perl
здесь:
perl -ni -e 'print unless /string1/ && /string2/'
Para manejar esa macro en particular, puede usar la opción --regex-<LANG>
:
ctags --regex-c='/^[^#]*_EXFUN *\( *([^,]+),.*/\1/p/'...
Lo que genera un archivo tags
con:
_EXFUN test.c 1;" d file:
strchr test.c /^char *_EXFUN(strchr,(const char *, int));$/;" p
Ejecute ectags
en el archivo preprocesado y pídale que mire los comentarios del preprocesador(--line-directives=yes
)y que escriba números de línea en el archivo tags
(-n
o--excmd=numbers
).
cc -E prog.c >prog.p
ectags --line-directives=yes --language-force=c --c-kinds=p -n prog.p
Archivo C de muestra:
#define _EXFUN(name, proto) name proto
char *_EXFUN(strchr,(const char *, int));
Archivo resultante 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.8 //
strchr prog.c 3;" p file:
Como puede ver, el prototipo de strchr
aparece en la línea 3 en prog.c
.
La desventaja de esto es que no obtiene entradas de etiquetas para preprocesar macros.
Puede resolver eso ejecutando ectags
en los archivos originales y preprocesados aunque:
ectags --line-directives=yes --language-force=c --c-kinds=pd -n -I _EXFUN prog.p prog.c
que produce
[...]
_EXFUN prog.c 1;" d file:
strchr prog.c 3;" p file: