bash는 sed 명령에서 한 줄씩 값 대신 동일한 값으로 확장됩니다.

bash는 sed 명령에서 한 줄씩 값 대신 동일한 값으로 확장됩니다.

아래와 같이 숫자.txt가 포함된 숫자가 포함된 파일이 있습니다.

9374541632553  
51243747879841  
32030098896914  
84654557358238  
11000656847765

다음 형식으로 변환하고 싶습니다.

<item>9 3 7 4 5 4 1 6 3 2 5 5 3 <tag>out="9374541632553" 
<item>5 1 2 4 3 7 4 7 8 7 9 8 4 1 <tag>out="51243747879841" 
<item>3 2 0 3 0 0 9 8 8 9 6 9 1 4 <tag>out="32030098896914"
<item>8 4 6 5 4 5 5 7 3 5 8 2 3 8 <tag>out="84654557358238"
<item>1 1 0 0 0 6 5 6 8 4 7 7 6 5 <tag>out="11000656847765"

변환하려면 다음 명령을 사용하고 있습니다.

cat numbers.txt | while read line; do sed -r "s/([0-9])/\1/g; s/([0-9])/\1 /g ; s/^/<item>/g; s/$/<tag>out="\$line/g" ; done

그러나 내가 얻는 결과는 다음과 같습니다.

<item>5 1 2 4 3 7 4 7 8 7 9 8 4 1 <tag>out="9374541632553
<item>3 2 0 3 0 0 9 8 8 9 6 9 1 4 <tag>out="9374541632553
<item>8 4 6 5 4 5 5 7 3 5 8 2 3 8 <tag>out="9374541632553
<item>1 1 0 0 0 6 5 6 8 4 7 7 6 5 <tag>out="9374541632553
<item>3 3 2 1 6 7 8 2 0 9 3 8 4 2 <tag>out="9374541632553

마지막 열이 행 단위 값이 아닌 첫 번째 행만 인쇄하는 이유를 누구든지 말해 줄 수 있습니까?
출력의 첫 번째 줄은 어떻습니까?
원하는 출력을 얻으려면 필요한 명령을 해석하십시오.

답변1

반복하지 않고도 이 작업을 수행할 수 있습니다 awk.

awk '{a=$1;gsub(/./,"& ",$1); print "<item>"$1"<tag><out>=""\""a"\""}' numbers.txt

산출:

<item>9 3 7 4 5 4 1 6 3 2 5 5 3 <tag><out>="9374541632553"
<item>5 1 2 4 3 7 4 7 8 7 9 8 4 1 <tag><out>="51243747879841"
<item>3 2 0 3 0 0 9 8 8 9 6 9 1 4 <tag><out>="32030098896914"
<item>8 4 6 5 4 5 5 7 3 5 8 2 3 8 <tag><out>="84654557358238"
<item>1 1 0 0 0 6 5 6 8 4 7 7 6 5 <tag><out>="11000656847765"

설명하다:

  • 먼저 첫 번째 필드를 $1변수에 저장합니다.a
  • 각 문자를 $1자체 문자로 바꾸고 그 뒤에 공백을 넣습니다.
  • 마지막으로 원하는 순서대로 모든 것을 인쇄합니다.
  • 약간 까다로운 부분은 \"따옴표 자체가 있어야 하는 곳에 큰따옴표를 인쇄 하는 것입니다.

편집(마지막 공백 제거):

awk '{a=$1;gsub(/./,"& ",$1); printf "<item>"$1"\b<tag><out>=""\""a"\"\n"}' numbers.txt

<item>9 3 7 4 5 4 1 6 3 2 5 5 3<tag><out>="9374541632553"
<item>5 1 2 4 3 7 4 7 8 7 9 8 4 1<tag><out>="51243747879841"
<item>3 2 0 3 0 0 9 8 8 9 6 9 1 4<tag><out>="32030098896914"
<item>8 4 6 5 4 5 5 7 3 5 8 2 3 8<tag><out>="84654557358238"
<item>1 1 0 0 0 6 5 6 8 4 7 7 6 5<tag><out>="11000656847765"

답변2

왜냐하면 둘 다 표준 입력 read에서 데이터를 얻기 때문입니다.sed

while루프 에서 read첫 번째 줄을 $line.그리고 sed시작합니다. 다른 입력을 제공하지 않으므로 stdin에서 읽습니다. 따라서 cat numbers.txt나머지 sed입력이 소비됩니다. 아직 while 루프의 첫 번째 반복에 있으므로 $line 변수는 변경되지 않습니다.

나는 이것을 위해 Perl을 사용할 것입니다:

perl -lne '($spaced = $_) =~ s/./$& /g; print qq{<item>$spaced<tag>out="$_"}' numbers.txt

답변3

sed에서 모든 작업을 수행할 수 있는 한 가지 방법은 다음과 같습니다.

sed '
    h; 
    s/./& /g;
    s/.*/<item>&<tag>out=/;
    G;
    s/\n\([0-9]*\)/"\1"/;
    ' numbers.txt

답변4

이건 어때...

cat numbers.txt | while read line; do echo $line | sed -r "s/([0-9])/\1/g; s/([0-9])/\1 /g ; s/^/<item>/g; s/$/<tag>out=\"$line\"/g" ; done

또는,

cat numbers.txt | while read line; do echo "<item>$(echo $line | fold -w1 | paste -s -d' ') <tag>out=\"$line\""; done

관련 정보