使用 vim 替换 - 用字符串替换模式

使用 vim 替换 - 用字符串替换模式

我有一个文件,其中包含以下格式的行 -

[[email protected], [email protected]], Payment processed - 23499, params = {'invoice':3243}

我只想要帐号,即 23499。它是一个数字。咱们来说说吧<account>。它不是一个常数。

为此,我正在努力——

  1. 消除params ...
  2. 将每行开头的 [...] 替换为空格

我的意思...是任何字符串。我努力了 -

# 1
:%s/params.*//g
# 2
:%s/\<[]\>//g
:%s/\<\[\]\>//g
:%s/\<[.*]\>//g
:%s/\<\[.*\]\>//g

我尝试过的所有事情都# 2没有奏效。我究竟做错了什么?如何得到<account>?帮帮我。

答案1

您可以使用以下顺序仅保留帐号(库多致 JDMMohr)
注意命令中 r 后面的空格

:%norm $F,d$Bhv0r 

,这假设您要保留的数字后面只有一个

分解

:     -> Enter command mode
%norm -> Applies a normal command to the entire file
$     -> Jump to end of line
F,    -> Find preceding ,
d$    -> Delete until end of line
B     -> Jump back a word
hv0   -> Go left one character and select until beginning of line
r     -> replace selected text with <space>

答案2

仅获取<account>字符串

awk '{print $6}' file| sed 's/,//' >> newfile

对于将来可能使用的主要数据,这可能很有用

答案3

如果您要查找<account>( 之类的东西<12345>) 并且具有<并且>仅在 中<account>,就像问题的原始版本中那样,那么这可以工作:

%s/\v.*(\<.*\>).*/\1/

<>and 之间的任何内容(位于一个组中)以及该行之前和之后的任何内容相匹配。这仅被组所取代。

回答更新的问题:

如果你没有<account>, 但这里有一个数字,没有<>: ,这以类似的方式工作:

%s/\v.* - ([0-9]*), params =.*/\1/

它匹配数字,将它们分组保存。它匹配之前以“-”结尾的任何内容,以及之后以 开头的任何内容, params =,直到行首或行尾。
因此表达式匹配整行,并被包含数字的匹配组替换。

它用于\v“非常神奇”的正则表达式,请参阅:help /magic

答案4

vim尽管想要使用(或sed为此)可能很容易,awk但实际上完全能够自行完成这种类型的匹配和替换:

$ awk '{ sub(/^.* - /, ""); sub(/,.*$/, ""); print $0 }' file
23499

上面的内容匹配所有内容(带有awk的内置sub()功能) 从行首到帐号之前的连字符和空格,并将其替换为空字符串""。然后,它匹配从逗号到行尾的所有内容,并将其替换为空字符串。这应该可以有效地(例如,无论有多少电子邮件或其格式如何)删除除帐号之外的所有内容。

如果您有权访问gawk,那么您可以使用更简单的解决方案(仅需要一个函数调用):

$ gawk 'match($0, /^.* - ([0-9]+),.*$/, a) { print a[1] }' file
23499

当然,上述解决方案将新数据打印到stdout.如果您想保存新数据以供以后使用,您所需要做的就是添加> newfile到上述命令的末尾(注意,这>会覆盖;如果您更喜欢附加,可以使用>>)。

awk它本身有许多限制(例如,同时处理许多文件),因此它并不总是此类操作的最佳工具。然而,它的功能非常出色,因此当您的用例与其圆形房屋相符时,我强烈建议使用它。

此外,上述解决方案不需要交互界面(如vim),也不需要管道。

相关内容