sed를 사용하여 파일에서 텍스트 조각을 추출하는 방법은 무엇입니까?

sed를 사용하여 파일에서 텍스트 조각을 추출하는 방법은 무엇입니까?

다음과 유사한 줄이 많이 포함된 파일에서 텍스트 조각을 추출하기 위해 BASH 스크립트를 만들려고 합니다.

"11","category/subcategory/sub-subcategory/item-1","index.php?option=com_trombinoscopeextended&Itemid=125&lang=es&view=trombinoscope","251","0","0000-00-00","","","","","","","0"

각 행에서 다음을 유지하면 됩니다.

category/subcategory/sub-subcategory/item-1

컨텍스트를 삭제할 수 있습니다. sed를 사용하려고 하는데 이를 수행할 수 있는 방법을 찾을 수 없습니다. 이미 가지고 있는 정규식을 사용하여 명령을 생성하는 방법을 이해할 수 없습니다.

\w+(\/[\w-]+)+

나는 이 명령과 다른 명령에 대해 읽고 이미 시도했지만 잘 이해가 되지 않습니다.

cat file.txt | sed -i -E "s/\w+(\/[\w-]+)+"

이것은 확실히 작동하지 않으며 sed 및 정규식 사용 방법에 대한 초보자 가이드를 찾을 수 없습니다.

답변1

다음을 사용하여 이러한 파일을 구문 분석하는 것이 가장 좋습니다 awk.

awk -F, '{ print $2 }' file

또는 cut,

cut -d, -f 2 file

"category/subcategory/sub-subcategory/item-1"그러면 귀하가 제공한 데이터(인용문 포함) 가 제공됩니다 .

을 사용 sed하고 제공한 정규식을 활용합니다(단, \w로 대체 [[:alnum:]]).

sed -E 's@.*,"([[:alnum:]]+(/[[:alnum:]-]+)+)",.*@\1@' file

이렇게 하면 전체 줄이 첫 번째 대괄호 세트 내의 정규식과 일치하는 비트로 대체됩니다. 그러면 category/subcategory/sub-subcategory/item-1제공한 데이터가 반환됩니다.

쉼표나 큰따옴표가 포함될 수 있는 필드와 따옴표의 올바른 처리를 포함하여 보다 일반적인 CSV 파일 구문 분석을 수행하려면 다음을 사용하세요.csvkit:

csvcut -c 2 file

답변2

정규식 자체에는 아무런 문제가 없습니다. 실수로 함정에 빠졌을 뿐입니다. [] 안에 \w는 두 개의 리터럴, 즉 백슬래시와 "w"입니다. 생각하는 "\w"가 아니거나 Perl에서와 같이 거기에서 빌려온 것이지만 정확하게 빌려온 것은 아닙니다.

한 가지 방법은 \w에 있는 내용을 명시적으로 나열한 다음 계속하는 것입니다.

sed -Ee '
    /\n/{P;D;}
    s|\w+(/[-_A-Za-z0-9]+)+|\n&\n|;D
'

관련 정보