CLEX420 Asked: 2018-05-01 22:26:00 +0800 CST2018-05-01 22:26:00 +0800 CST 2018-05-01 22:26:00 +0800 CST 如何删除包含特定语法的行但我想避免包含另一个单词的行 772 如何删除带有特定单词的行,但请记住:如果找到另一个单词,则不要删除该行。例如,我正在删除具有suporgnd的行:%s/.*sup.*//gor :%s/.*gnd.*//g,但它也删除了一些破坏循环行的行。 我不想删除与ormodule位于同一行的行。知道如何征服这条线吗?gndsup linux gvim 2 个回答 Voted Best Answer Stéphane Chazelas 2018-05-01T22:44:05+08:002018-05-01T22:44:05+08:00 你可以使用: :v/module/s/\v.*(sup|gnd).*// :v/pattern/cmd在与模式不匹配的cmd行上运行 \v打开very-magic,以便所有(,|字符都被视为正则表达式运算符,而无需在它们前面加上\. 请注意,它会清空但不会删除包含supor的行gnd。要删除它们,由于您不能嵌套g/v命令,您可以vim在一个命令中使用 ' 负前瞻正则表达式运算符g: :g/\v^(.*module)@!.*(sup|gnd)/d :g/pattern/cmd在与模式匹配的cmd行上运行 (pattern)@!(with very-magic ) 如果模式在该位置不匹配,则匹配零宽度,因此^(.*module)@!匹配不包含module. 还可以选择管道到sedor awk: :%!sed -e /module/b -e /sup/d -e /gnd/d /module/b对于包含module. 对于不包含的行,我们继续执行接下来的两个命令,如果它包含sup或gnd分别删除该行。 或者: :%!awk '/sup|gnd/ && ! /module/' 如果您想找到那些需要删除这些行的文件并将其删除,您可能希望跳过vim并使用文本处理实用程序完成整个操作。在 GNU 系统上: find . ! -name '*.back' -type f -size +3c -exec gawk ' /sup|gnd/ && ! /module/ {printf "%s\0", FILENAME; nextfile}' '{}' + | xargs -r0 sed -i.back -e /module/b -e /sup/d -e /gnd/d (此处将原始文件的备份保存为,如果您不需要备份,请the-file.back更改-i.back为)。-i find查找名称不以结尾.back且大小至少为 4 个字节的常规文件(较小的文件不可能包含包含supor gnd(和行分隔符)的行)并gawk以相应文件的路径作为参数运行. 当gawk在任何匹配的文件中找到一行时,它会打印FILENAME以 NUL 字符 (for ) 分隔的文件 (特殊变量)的路径xargs -0并跳到下一个文件。 xargs -r0gawk输出以sed这些文件路径作为参数运行的进程。 sed就地编辑文件。 CLEX420 2018-05-02T22:11:03+08:002018-05-02T22:11:03+08:00 找到它:v/(module\|input\|output)/s/\v。. /
你可以使用:
:v/pattern/cmd
在与模式不匹配的cmd
行上运行\v
打开very-magic,以便所有(
,|
字符都被视为正则表达式运算符,而无需在它们前面加上\
.请注意,它会清空但不会删除包含
sup
or的行gnd
。要删除它们,由于您不能嵌套g
/v
命令,您可以vim
在一个命令中使用 ' 负前瞻正则表达式运算符g
::g/pattern/cmd
在与模式匹配的cmd
行上运行(pattern)@!
(with very-magic ) 如果模式在该位置不匹配,则匹配零宽度,因此^(.*module)@!
匹配不包含module
.还可以选择管道到
sed
orawk
:/module/b
对于包含module
.sup
或gnd
分别删除该行。或者:
如果您想找到那些需要删除这些行的文件并将其删除,您可能希望跳过
vim
并使用文本处理实用程序完成整个操作。在 GNU 系统上:(此处将原始文件的备份保存为,如果您不需要备份,请
the-file.back
更改-i.back
为)。-i
find
查找名称不以结尾.back
且大小至少为 4 个字节的常规文件(较小的文件不可能包含包含sup
orgnd
(和行分隔符)的行)并gawk
以相应文件的路径作为参数运行.gawk
在任何匹配的文件中找到一行时,它会打印FILENAME
以 NUL 字符 (for ) 分隔的文件 (特殊变量)的路径xargs -0
并跳到下一个文件。xargs -r0
gawk
输出以sed
这些文件路径作为参数运行的进程。sed
就地编辑文件。找到它:v/(module\|input\|output)/s/\v。. /