긴 끈에서 특정 끈 자르기

긴 끈에서 특정 끈 자르기

문자열이 있습니다.

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로 처리됩니다. 따라서 전체 줄은 ^.*$괄호 안의 내용과 일치하는 부분으로 대체됩니다.

관련 정보