次の形式の行を含むファイルがあります。
[[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へのCudo)
コマンドの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>
)を探していて、inだけを持っている場合は、次のように<
動作します。>
<account>
%s/\v.*(\<.*\>).*/\1/
(グループ内)の間のすべての項目とその行の前後のすべての項目<
と一致します。>
これは単にグループに置き換えられます。
更新された質問に対する回答:
そうではありませんが、ここにそして:<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
より簡単なソリューションを使用できます(関数呼び出しは1つだけ必要です)。
$ gawk 'match($0, /^.* - ([0-9]+),.*$/, a) { print a[1] }' file
23499
もちろん、上記のソリューションは、新しいデータをstdout
。あなたが使用できる。> newfile
>
>>
awk
それ自体には多くの制限があるため(多くのファイルを同時に処理するなど)、必ずしもこれらの操作に最適なツールではありません。ただし、機能が優れているため、ユースケースがラウンドハウスと一致する場合はお勧めします。
また、上記のソリューションには対話型インタフェース(たとえばvim
)が必要なく、パイプも必要ありません。