다음과 유사한 줄이 많이 포함된 파일에서 텍스트 조각을 추출하기 위해 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
'