![각 출력 줄이 블록 제목으로 시작하도록 텍스트를 어떻게 변환할 수 있습니까?](https://linux55.com/image/45891/%EA%B0%81%20%EC%B6%9C%EB%A0%A5%20%EC%A4%84%EC%9D%B4%20%EB%B8%94%EB%A1%9D%20%EC%A0%9C%EB%AA%A9%EC%9C%BC%EB%A1%9C%20%EC%8B%9C%EC%9E%91%ED%95%98%EB%8F%84%EB%A1%9D%20%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EB%B3%80%ED%99%98%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
다음을 변환하려면 스크립트를 작성해야 합니다.
Name = x:y
Z = a:b.c
Z1 = a1:b1.c1
End
Name=x1:y1
Z2 = a2:b2.c2
Z3 = a3:b3.c3
Z4 = a4:b4.c4
End
Name = l:k
s = w:e.v
End
입력하다:
x:y Z a:b.c
x:y Z1 a1:b1.c1
x1:y1 Z2 a2:b2.c2
x1:y1 Z3 a3:b3.c3
x1:y1 Z4 a4:b4.c4
l:k s w:e.v
답변1
=
선택적 주변 공백을 구분 기호로 사용합니다 .
awk -F '[[:blank:]]*=[[:blank:]]*' '
$1 == "Name" {name = $2; next}
$1 != "End" {print name, $1, $2}
' filename
예
이러한 솔루션을 살펴보면 awk
진행 상황이 약간 혼란스럽다는 것을 알 수 있습니다. 잘 배치된 인쇄 문을 삽입하면 무슨 일이 일어나고 있는지 시각적으로 볼 수 있습니다.
$ awk -F '[[:blank:]]*=[[:blank:]]*' '
$1 == "Name" { name = $2; print "--NAME: "$2; next };
$1 != "End" { print " --END: "name,$1,$2 }
' sample.txt
다음과 같은 출력이 생성됩니다.
--NAME: x:y
--END: x:y Z a:b.c
--END: x:y Z1 a1:b1.c1
--NAME: x1:y1
--END: x1:y1 Z2 a2:b2.c2
--END: x1:y1 Z3 a3:b3.c3
--END: x1:y1 Z4 a4:b4.c4
--NAME: l:k
--END: l:k s w:e.v
답변2
사용 방법sed
이 작은 sed
명령이 작업을 수행합니다.
sed -ne '
/^Name */{
s/^.*= *//;
h;
tb;
};
/^End/bb;
G;
s/^\(.*\) *= *\(.*\)\n\(.*\)$/\3\t\1\t\2/p;
:b
' <sourcefile.txt
x:y Z a:b.c
x:y Z1 a1:b1.c1
x1:y1 Z2 a2:b2.c2
x1:y1 Z3 a3:b3.c3
x1:y1 Z4 a4:b4.c4
l:k s w:e.v
설명하다:
- 줄이 다음으로 시작하는 경우이름, 까지 감소=, 그런 다음 태그에 저장
hold space
하고 태그로 이동합니다:b
. - 줄이 다음으로 시작하는 경우끝, label 까지 다음 단계를 건너뜁니다
:b
. - 라벨 앞
:b
(다른 경우):hold space
, than 추가만약에이 줄은 `문자열과 일치하며 그 뒤에는 임의 개수의 공백과 등호, 일부 공백, 두 번째 문자열, 개행 문자, 마지막으로 세 번째 문자열이 옵니다.그 다음에세 번째 문자열 다음에 탭 문자를 인쇄합니다. 첫 번째 문자열은 탭 문자이고 그 다음 두 번째 문자열입니다.
그리고 방금 사용하는 방법세게 때리다
while read line ;do
if [ ${line//=*} = "Name" ] ;then
name=${line//*=}
else
[ "${line//=*}" != "$line" ] &&
printf "%s\t%s\t%s\n" $name ${line//=}
fi
done <sourcefile.txt
x:y Z a:b.c
x:y Z1 a1:b1.c1
x1:y1 Z2 a2:b2.c2
x1:y1 Z3 a3:b3.c3
x1:y1 Z4 a4:b4.c4
l:k s w:e.v
답변3
이것은 펄입니다:
perl -ne 'if(/^Name\s*=\s*(.+)/){$n=$1;}else{print "$n $_" unless /^End/}' file
설명하다
perl -ne
입력 파일을 한 줄씩 처리하고( -n
), 각 줄을 변수에 저장하고 $_
에 인수로 제공된 스크립트를 실행하는 것을 의미합니다 -e
.
if(/Name\s*=\s*(.+)/){$n=$1;}
: 줄이 Name = <something>
. 로 시작하는 경우 . <something>
로 저장합니다 $n
.
그렇지 않고 행이 로 시작하지 않으면 행이 시작하지 않는 한 현재 값 , 이름 및 행의 나머지 부분이 Name
인쇄됩니다 .$n
End