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