다음 파일 예제가 있습니다.
some text is here
sometext(1,21);
sometext(2,9);
sometext(3,231);
sometext(10,1112);
sometext(11,17)
Some text is here
괄호 안에 두 번째 숫자가 포함된 행을 추출하려고 하므로 sometext
위의 예에서는 숫자가 21
, 9
, 231
, 1112
, 입니다 17
.
grep
위의 패턴에 맞는 명령을 찾지 못했습니다 .
답변1
GNU를 사용하는 경우 grep
RE를 사용하여 쉼표 뒤의 숫자를 일치시킬 수 있습니다.
grep -oP ',\K\d+' file
네이티브에 perl
해당하는 내용은 다음과 같습니다.
perl -lne 'print for /,\K\d+/g' file
답변2
이 grep
유틸리티는 적어도 표준 Unix 도구를 사용하려는 경우 행의 일부를 추출하는 데 적합하지 않습니다. 표준 grep
유틸리티는 패턴과 일치하는 전체 라인을 필터링하지만 부분 라인을 추출하는 자연스러운 방법은 없습니다. 보다 자세한 방법으로 선을 조작하려면 예를 들어 를 사용할 수 있습니다 sed
.
텍스트가 표시된 것보다 더 길고 다양하다고 가정하면 텍스트 문자열을 통해 sometext(
두 번째 정수 값으로 행을 처리할 시기를 알려줄 수 있습니다. 데이터에서 해당 문자열을 확인하면 두 번째 정수 앞과 뒤의 측면 비트를 잘라낼 수 있습니다.
여기서는 두 개의 트림 대체를 적용합니다. 하나는 줄의 시작부터 줄의 마지막 쉼표까지, 다른 하나는 닫는 괄호부터 줄의 끝까지 적용합니다. 각 줄의 기본 인쇄를 끄고 -n
두 번째 대체 후에 결과 문자열을 명시적으로 인쇄합니다.
sed -n '/sometext(/ { s/.*,//; s/).*//p; }' file
또한 특수 트리거 문자열과 일치하지 않는 행을 삭제하고 나머지 행에 두 대체 항목을 모두 적용할 수 있는 옵션도 있습니다.
sed -e '/sometext(/!d' -e 's/.*,//' -e 's/).*//' file
결과 목록을 쉼표로 구분된 목록(질문에 표시된 것처럼)으로 원하는 경우 위 명령의 결과를 파이핑하는 것을 고려하십시오.
paste -d, -s -
귀하의 질문에 대한 데이터를 바탕으로 우리는 다음을 얻습니다.
$ sed -e '/sometext(/!d' -e 's/.*,//' -e 's/).*//' file | paste -d, -s -
21,9,231,1112,17
답변3
이를 위해 필드 구분 기호로 awk
쉼표나 닫는 괄호( )를 사용합니다 . 그러면 -F'[,)]'
필드 2( ) $2
에 원하는 숫자가 생성 됩니다. 이것을 $2에 숫자만 포함되어 있는 수표와 결합합니다.
$ awk -F'[,)]' '$2 ~ /^[[:digit:]]+$/ {print $2}' input.txt
21
9
231
1112
17
이는 $2에 음수가 아닌 정수만 포함되어 있다고 가정합니다. 음수 및/또는 실수가 포함될 수 있는 경우 대신 다음을 사용하십시오.
awk -F'[,)]' '$2 ~ /^[-+]?[[:digit:]]+(\.[[:digit:]]+)?$/ {print $2}' input.txt
참고: awk는 쉼표를 필드 구분 기호로 사용하기 때문에 쉼표를 소수 구분 기호로 사용하는 로케일에서는 작동하지 않습니다.
답변4
무거운 작업을 수행하는 데 사용할 수 있으며 쉼표를 원하지 않는다고 가정하여 grep
정리에 사용할 수 있습니다 . tr
또한 게시물에서 출력을 어떻게 렌더링할지 명확하지 않아 줄 바꿈으로 구분된 숫자 목록이 생성됩니다.
grep -Eo ",[[:digit:]]+" input.txt | tr -d ","
또는 유일한 솔루션 tr
으로 사용하지 마십시오.grep
grep -Eo ",[[:digit:]]+" input.txt | grep -Eo "[^,]+"