문자열이 있습니다.
fvvDataFolders/DDB/DDB2018-02-21oM]
fbbDataFolders/DDB/DDB2018-02-22oM]
Data로 시작하고 날짜처럼 보이는 모든 항목을 제거하고 싶습니다.
DataFolders/DDB/DDB2018-02-21
DataFolders/DDC/DDB2018-02-22
어떻게 하면 되나요?
답변1
어느 하나
grep -P -o 'Data.+?\d\d\d\d-\d\d-\d\d'
또는
perl -pe 's/^.+(Data.+?\d\d\d\d-\d\d-\d\d).+$/$1/'
할 것입니다. 둘 다 Data
날짜(YYYY-MM-DD)처럼 시작하고 끝나는 최소 문자열을 인쇄합니다 .
echo "fvvDataFolders/DDB/DDB2018-02-21oM]" > input.txt
echo "fbbDataFolders/DDB/DDB2018-02-22oM]" >> input.txt
grep -P -o 'Data.+?\d\d\d\d-\d\d-\d\d' input.txt
# output:
DataFolders/DDB/DDB2018-02-21
DataFolders/DDB/DDB2018-02-22
perl -pe 's/^.+(Data.+?\d\d\d\d-\d\d-\d\d).+$/$1/' input.txt
# output:
DataFolders/DDB/DDB2018-02-21
DataFolders/DDB/DDB2018-02-22
답변2
다음과 같은 방법으로 명령을 사용할 수 있습니다 grep
.
grep -oP 'Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}' input-file > output-file
-o
,--only-matching
- PATTERN과 일치하는 행의 일부만 표시합니다.-P
,--perl-regexp
- PATTERN은 Perl 정규식입니다. 또는 이 경우 옵션도 사용할 수 있습니다-E
.--extended-regexp
- PATTERN은 확장 정규식(ERE)입니다.- 정규 표현식이
'Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}'
요구 사항과 일치합니다. 문자열로 시작하고Data
그 뒤에 알 수 없는 수*
의 문자가 오고.
날짜 형식4 digits from 0 to 9
(대시2 digits from 0 to 9
대시) 으로 끝납니다2 digits from 0 to 9
.
해결책 은 다음과 같습니다 sed
.
sed -r 's/^.*(Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}).*$/\1/' /tmp/input-file
- 출력을 새 파일로 리디렉션
> output-file
하거나 옵션을 사용하여-i.bak
해당 위치를 변경하고 백업 파일을 만듭니다. -r
,--regexp-extended
- 스크립트에서 확장 정규식을 사용합니다.- 명령은
s
대체를 의미합니다:/<string-or-regexp>/<replacement>/
. ^.*
^
줄의 시작 부분과 일치하며 그 뒤에는 알 수 없는 수의 문자가 옵니다..*$
행의 끝 부분과 일치하며$
그 앞에는 알 수 없는 수의 문자가 있습니다.- 캡처 그룹 내에서
(...)
변수 \1로 처리됩니다. 따라서 전체 줄은^.*$
괄호 안의 내용과 일치하는 부분으로 대체됩니다.