
파일 내용은 다음과 같습니다. "[]" 안에 있는 티켓 번호만 인쇄하면 됩니다. sed 및 grep 명령을 모두 사용하여 이 작업을 수행할 수 있는지 궁금합니다.
[request://Problem/26727777] SSO Components (UAT)
[request://Problem/25709048] [SERVER-SETUP] Setup 14xMDN, 10xPRN
[request://Problem/26716590] Logs not populated properly from all servers
[request://Problem/23995808] Prod: Create requestmary
출력은 다음과 같아야 합니다:
26727777
25709048
26716590
23995808
시도했지만 sed -e 's/[^0-9]//g' ticket | sed '/^$/d'
원하는 결과를 얻을 수 없습니다. 또한 줄에 다른 숫자 값도 포함되어 있으므로 티켓 번호만 가져와야 합니다.
226829515211
226855182
2268555334
226819615
226781310
226853999
226828948216
답변1
GNU를 사용할 수 있습니다 grep
.
$ grep -oP '/\K\d+(?=])' ticket
26727777
25709048
26716590
23995808
또는 sed
:
sed -E 's#.*/([0-9]*).*#\1#g' ticket
26727777
25709048
26716590
23995808
위의 두 가지 모두 제공한 예제에서 작동하지만 실제 파일에서 작동하는지 여부는 파일의 다른 행에 따라 달라집니다. a 뒤에 있는 모든 숫자 /
와 grep
a 앞에 있는 의 모든 숫자를 인쇄합니다 ]
. 해당 기준과 일치하는 다른 줄이 있는 경우 전체 파일을 보여주셔야 합니다.
답변2
개인적으로 Perl을 사용하겠습니다.
perl -lne 'print /(\d+)\]/'
트릭을 수행해야합니다.
-l
'줄 바꿈 정렬'이라고 말하면 줄 바꿈을 자동으로 제거하고 각 뒤에 삽입합니다 print
.
-n
'이것을 while (<>) {
루프로 포장합니다 - STDIN(또는 파일)을 한 줄씩 반복합니다 grep
.
그리고 -e
따옴표로 묶인 명령을 실행하는 "표현식"(또는 "실행"이라고 생각합니다)입니다. (그렇지 않으면 perl
에서 프로그램을 읽으십시오 STDIN
)
우리는 정규 표현식의 기본 일치 항목이 반대라는 사실을 사용합니다 $_
(이 문맥에서는 현재 행입니다).
캡처 그룹을 지정하기 때문에 "true" 또는 "false"를 반환하는 대신 캡처된 값의 (단일 요소) 목록을 반환합니다.
\d+
하나 이상의 숫자입니다. ('고급' 정규 표현식으로, 와 거의 유사하지만 [0-9]+
라틴어가 아닌 숫자를 사용하는 경우 약간 다르게 작동합니다.) ]
그 뒤에 가 필요합니다.
그리고 왜냐하면 우리는~하지 않다g
정규식 끝에 사용하면 한 줄에 한 번만 일치합니다.
답변3
sed 's/[^0-9]*\([0-9]*\).*/\1/'
하지만 티켓 번호의 너비가 고정되어 있으면 를 사용하는 것이 좋습니다 cut
.
편집: grep을 사용하여:
grep -o '^\[[^0-9]*[0-9]*' | grep -o '[0-9]*'
답변4
tr "\[\]/" " "| awk '/request/ { print $3 }'