다음 형식의 줄이 포함된 파일이 있습니다.
[[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
더 간단한 솔루션을 사용할 수 있습니다(함수 호출은 하나만 필요함).
$ gawk 'match($0, /^.* - ([0-9]+),.*$/, a) { print a[1] }' file
23499
물론 위 솔루션은 새 데이터 를 stdout
. 당신이 사용할 수있는 .> newfile
>
>>
awk
자체적으로 많은 제한이 있으므로(예: 많은 파일을 동시에 처리) 항상 이러한 작업에 가장 적합한 도구는 아닙니다. 하지만 기능이 뛰어나므로 사용 사례가 라운드하우스와 일치할 때 사용하는 것이 좋습니다.
또한 위의 솔루션에는 대화형 인터페이스(예: vim
)가 필요하지 않으며 파이프도 필요하지 않습니다.