sed를 사용하여 다양한 숫자 및 기타 문자 일치

sed를 사용하여 다양한 숫자 및 기타 문자 일치

sed나는 Perl과 같은 정규식을 작성하는 경향이 있습니다 .

[\d-_]+

예를 들어 숫자, 대시, 밑줄을 일치시킵니다. 그것은 매력처럼 작동합니다 grep.

$ 더 sed_example.txt
일부 2021-04-21_08-45_file
다른 것들2021-04-21_08-15_test
등.
$ grep -P "[\d-_]+" sed_example.txt
무엇2021-04-21_08-45_문서
다른 것들2021-04-21_08-15_시험

이제 sed로 동일한 작업을 수행하고 싶지만 확장 표현식( -r)으로도 사용할 수 없으며 범위(예: or)를 다른 문자와 \d결합할 수 없거나 적어도 방법을 찾지 못했습니다. 한 가지 해결책은 모든 숫자를 명시적으로 나열하는 것이지만 너무 게으릅니다.[0-9][[:digits:]]

어떤 도움이라도 대단히 감사하겠습니다!

답변1

범위가 적합하지 않습니다( 시작하여 실행할 범위가 [\d-_]없음 ). 그런 뜻 이었습니까 ?\d_[\d_-]

POSIX에 해당하는 것은 또는 [\d_-]입니다 . 대괄호 표현식에 리터럴 대시를 포함하려면 첫 번째 또는 마지막에 나타나야 합니다.[[:digit:]_-][0-9_-]

$ grep -o '[[:digit:]_-]\{1,\}' file
2021-04-21_08-45_
2021-04-21_08-15_
$ sed -n 's/.* \([[:digit:]_-]\{1,\}\).*/\1/p' file
2021-04-21_08-45_
2021-04-21_08-15_

여기에서 첫 번째 숫자 앞의 공백을 일치시켜야 합니다. 그렇지 않으면 _마지막 숫자만 캡처합니다.

숫자, 대시 또는 밑줄 대신 찾고 있는 양식의 항목과 실제로 일치시키려는 보다 구체적인 정규식을 사용할 수도 있습니다.

$ sed -n 's/.*\([0-9]\{4\}-[0-9][0-9]-[0-9][0-9]_[0-9][0-9]-[0-9][0-9]_\).*/\1/p' file
2021-04-21_08-45_
2021-04-21_08-15_

$ tr -d -c '\n[:digit:]_-' <file | tr -s '\n'
2021-04-21_08-45_
2021-04-21_08-15_

tr여기서는 숫자가 아닌 문자, 개행 문자가 아닌 문자, 밑줄이 아닌 문자, 대시가 아닌 문자를 모두 제거 했습니다 . 그런 다음 이를 다시 사용하여 여러 연속 개행 문자를 단일 개행 문자로 압축했습니다.

관련 정보