우리에겐 가치가 있다
XX_EMAIL_GL_BTCH_ATTACH FCP_REQID=8830260 FCP_LOGIN="APPS/pwd" FCP_USERID=4807 FCP_USERNAME="USER" FCP_PRINTER="noprint" FCP_SAVE_OUT=Y FCP_NUM_COPIES=1 "XX WBP 8-501 Misc Receipts" "[email protected]"
우리는 가치를 얻어야 합니다 XX WBP 8-501 Misc Receipts
.
아래와 같이 시도했지만 XX만 반환됩니다.
echo XX_EMAIL_GL_BTCH_ATTACH FCP_REQID=8830260 FCP_LOGIN="APPS/pwd" FCP_USERID=4807 FCP_USERNAME="USER" FCP_PRINTER="noprint" FCP_SAVE_OUT=Y FCP_NUM_COPIES=1 "XX WBP 8-501 Misc Receipts" "[email protected]" | cut -d" " -f9 | sed 's/"//g'
답변1
스키마에 따라 몇 가지 열을 추가하면 됩니다 cut
.
cut -d' ' -f9-13 | sed 's/"//g'
순수한 솔루션을 사용할 수도 있습니다 sed
.
sed 's/.*"\(.*\)" ".*"$/\1/'
패턴은 문자열 끝에 있는 두 개의 큰따옴표에 따라 달라집니다. 이렇게 하면 두 개 중 첫 번째 항목(또는 전체 문자열에서 두 번째 큰따옴표로 묶인 하위 문자열)이 표시됩니다.
고쳐 쓰다:echo
OP가 원하는 것처럼 ...
echo 'XX_EMAIL_GL_BTCH_ATTACH FCP_REQID=8830260 FCP_LOGIN="APPS/pwd" FCP_USERID=4807 FCP_USERNAME="USER" FCP_PRINTER="noprint" FCP_SAVE_OUT=Y FCP_NUM_COPIES=1 "XX WBP 8-501 Misc Receipts" "[email protected]"' | sed 's/.*"\(.*\)" ".*"$/\1/'
답변2
string 을 입력하는 방식으로 echo
쉘은 큰따옴표를 사용하므로 9번째 필드의 길이를 알 수 없습니다. 먼저 문자열을 작은따옴표로 묶어야 합니다.
cut
그런 다음 구분 기호로 공백을 찾고 있으며 따옴표 안의 공백을 무시하는 방법을 모른다는 점을 고려해야 합니다 . 따라서 다음을 수행하십시오.
echo 'XX_EMAIL_GL_BTCH_ATTACH FCP_REQID=8830260 FCP_LOGIN="APPS/pwd" FCP_USERID=4807 FCP_USERNAME="USER" FCP_PRINTER="noprint" FCP_SAVE_OUT=Y FCP_NUM_COPIES=1 "XX WBP 8-501 Misc Receipts" "[email protected]"' | cut -d" " -f9- | cut -d\" -f 2
첫 번째는 cut
9번째 필드부터 시작하는 모든 것을 유지하고, 두 번째는 "
구분 기호로 첫 번째 따옴표 쌍 안의 부분만 유지합니다.
pure를 사용하여 sed
동일한 작업을 수행할 수 있습니다.
sed -E 's/([^ ]* ){8}//;s/"//;s/".*//'
어쨌든 이전 열 필드에 공백을 추가하면 스크립트가 손상될 수 있습니다.
답변3
cut
추출하는 동안 사용하면 안정적인 솔루션이 제공되지 않습니다.논리해당 입력의 하위 문자열입니다.
다음 솔리드 솔루션 중 하나를 사용하십시오.
1)Python
명령(단순화):
python -c 'import csv,sys; r=csv.reader(sys.stdin, delimiter=" "); print(next(r)[8])' <file
파이썬~의데이터 세트모듈 ID는 표 형식 데이터를 읽고 쓰는 데 적합합니다.
2)GNUawk
주문하다:
awk -v FPAT='"[^"]+"|[^"]+' '{ gsub("\"","",$8); print $8 }' file
출력은 다음과 같습니다둘 다방법:
XX WBP 8-501 Misc Receipts