我有一个文件,其中包含以下格式的行 -
[[email protected], [email protected]], Payment processed - 23499, params = {'invoice':3243}
我只想要帐号,即 23499。它是一个数字。咱们来说说吧<account>
。它不是一个常数。
为此,我正在努力——
- 消除
params ...
- 将每行开头的 [...] 替换为空格
我的意思...
是任何字符串。我努力了 -
# 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
),也不需要管道。