문자열의 중간 부분을 반환하려면 cut을 사용하세요.

문자열의 중간 부분을 반환하려면 cut을 사용하세요.

stdout다음과 같이 에코된 XML 문자열이 있습니다 .

<xml:attribute>{41c33a-4893b-3627a-617a}</xml:attribute>

{41c33a-4893b-3627a-617a}이 경우 문자열을 반환하고 싶습니다. 컷을 사용하려고 하는데(파이핑을 두 번 할 수도 있음) 올바른 구문을 모르겠습니다. 나는 배쉬를 사용하고 있습니다.

답변1

cut구분 기호를 정의하는 데 사용할 수 있는 옵션 -d(결과 필드에서 제외):

echo "<xml:attribute>{41c33a-4893b-3627a-617a}</xml:attribute>" | cut -d\> -f2 | cut -d\< -f1

이는 >두 번째 필드를 분할하여 출력하고 그대로 둔 {41c33a-4893b-3627a-617a}</xml:attribute다음 <첫 번째 필드를 다시 분할하여 출력합니다.

필드는 구분 기호 사이, 텍스트 시작과 첫 번째 구분 기호 사이, 마지막 구분 기호와 텍스트 끝 사이의 텍스트를 설명합니다. 원본 텍스트를 사용하면 >다음과 같이 됩니다.

  1. <xml:attribute
  2. {41c33a-4893b-3627a-617a}</xml:attribute
  3. 빈 문자열

(구분자 생략) 그런 다음 <필드 2에서 다음을 사용하여 제공됩니다.

  1. {41c33a-4893b-3627a-617a}
  2. /xml:attribute

필드 1은 당신이 찾고 있는 결과입니다.

답변2

간단한 문자열 조작의 경우 일반적으로 다음과 같은 쉘 자체 구성을 사용해야 합니다.매개변수 확장. 외부 유틸리티는 대량의 텍스트를 처리하는 데 더 적합하지만 단일 문자열의 경우 외부 도구 실행 속도가 느리고 올바르게 인용하기 어려울 수 있습니다.

mystring='<xml:attribute>{41c33a-4893b-3627a-617a}</xml:attribute>'
content="${mystring#*>}"; content="${content%<*}"
braced="${mystring#*\{}"; braced="${braced%%\}*}"; braced="{$braced}"

content앞부분과 뒷부분을 제외한 원래 문자열로 설정합니다 <…>. braced첫 번째 부분처럼 보이도록 설정합니다 {…}.

답변3

sed정규식으로 지정된 필드를 추출 할 수도 있습니다 . 더 복잡한 일치 조건이 있는 경우 유용합니다.

echo '<xml:attribute>{41c33a-4893b-3627a-617a}</xml:attribute>' | \
sed -E 's/^.+>({.+})<.+$/\1/'

답변4

또는 를 사용하거나 필드 구분자로 awk정규식을 사용합니다 .<|>

$ echo "<xml:attribute>{41c33a-4893b-3627a-617a}</xml:attribute>" | 
       awk -F '<|>' '{print $3}'
{41c33a-4893b-3627a-617a}

참고: GNU awk, 및 로 mawk테스트되었습니다 original-awk. 작동 원리는 세 가지 모두 동일합니다.

perl버전은 매우 유사합니다( perl배열이 0부터 시작하고 명시적으로 지정하지 않는 한 perl명령문 print이 후행을 출력하지 않는다는 점 을 제외하면).\n

echo "<xml:attribute>{41c33a-4893b-3627a-617a}</xml:attribute>" |
     perl -n -a -F'<|>' -e 'print $F[2],"\n"'

또한 참고하세요. 이는 단일 XML 조각을 포함하는 단일 입력 줄이므로 안정적으로 작동합니다. 정규식은 실제 XML을 안정적으로 구문 분석하는 데 사용할 수 없습니다. 예를 들어 XML 구문 분석 도구를 대신 사용하거나 , xmlstarlet, 및 기타 언어에 대한 많은 XML 구문 분석 라이브러리 중 하나를 사용하십시오.perlpython

관련 정보