SED를 사용하여 문자열에서 값 파생

SED를 사용하여 문자열에서 값 파생

나는 사용하고 싶다 echo "123|456|789" | sed 's/^\(.*|\)\(.*|\).*$/\1'

문자열을 끊고 개별 값을 얻으려고 합니다(파이프| 없이).

  • 장면 1: 갖고 싶어123
  • 장면 2: 갖고 싶어456
  • 장면 3: 갖고 싶어789
  • 장면 4: 나는 얻고 싶다123 456 789

답변1

무엇을 원하시는지 잘 모르겠으니 수리 명령으로 답변을 제한하겠습니다. 그것은해야한다:

에코 "123|456|789" sed /^(.|)(.|).*$/\1/'

(마지막 따옴표 앞에 /가 있음을 참고하세요)

그런 다음 출력을 제공합니다.

123|

이것이 당신이 원하는 것입니까?

답변2

  1. echo '123|456|789' | sed 's/|.*//'
  2. echo '123|456|789' | sed 's/^[0-9]*|//;s/|.*//'
  3. echo '123|456|789' | sed 's/.*|//'
  4. echo '123|456|789' | sed 's/|/ /g'

또는 사용하는 것을 가치있게 여기지 않는 경우sed

  1. echo '123|456|789' | cut -f1 -d\|
  2. echo '123|456|789' | cut -f2 -d\|
  3. echo '123|456|789' | cut -f3 -d\|
  4. echo '123|456|789' | cut -f1,2,3 --output-delimiter=" " -d\|

답변3

내 이전 답변은 버그를 수정했습니다. 제가 실제로 해결한 방법은 다음과 같습니다.

시나리오 4는 가장 복잡하므로 해결 방법은 다음과 같습니다.

echo '123|456|789' | sed 's/\([0-9]*\)|\([0-9]*\)|\([0-9]*\)/\1 \2 \3/'

마지막 \1, \2, \3은 "장식 괄호"( \( 및 \)) 사이에서 일치하는 부분을 선택합니다. 각 그룹은 다음 번호로 참조되므로 \1은 첫 번째 그룹을 나타내는 식입니다.

시나리오 1, 2, 3의 경우 단순화할 수 있지만 필요에 따라 잘라내어 붙여넣은 다음 //의 마지막 그룹 사이에 \1, \2 또는 \3을 추가하는 것이 더 쉽습니다. 나머지 장식용 괄호를 그대로 두어도 문제가 되지 않습니다.

이 솔루션은 원하는 수의 필드로 확장될 수 있지만 가능하다면 cut을 사용하는 것이 더 좋을 것 같습니다.

답변4

GNU sed를 사용하면 쉘 var에서 필드 번호를 언급하여 필드를 캡처할 수 있습니다.$n

n=2; # to get field number 2
echo "123|456|789" | sed -n "s/|/\n/$n;s/^[^\n]*|//;P"

시나리오 4의 경우 다음과 같습니다.

echo ... | sed -e 'y/|/ /'

관련 정보