구분 기호로 긴 줄을 나누기


21

다음과 같이 입력을 분할하는 데 어떤 명령을 사용할 수 있습니까?

foo:bar:baz:quux

이것으로?

foo
bar
baz
quux

나는 cut명령을 알아 내려고 노력하고 있지만 "첫 1000 문자"또는 "처음 7 필드"와 같이 고정 된 양의 입력에서만 작동하는 것 같습니다. 임의로 긴 입력으로 작업해야합니다.


5
당신은 같은 의미 tr : '\n' < input입니까?
jw013

어떤 쉘을 사용하고 있습니까? 세게 때리다?
glenn jackman

답변:


34

몇 가지 옵션이 있습니다.

  • tr : \\n
  • sed 's/:/\n/g'
  • awk '{ gsub(":", "\n") } 1'

순수 하게이 작업을 수행 할 수도 있습니다 bash.

while IFS=: read -ra line; do
    printf '%s\n' "${line[@]}"
done

3
\n이와 같은 대체 문자열 을 사용 하면 GNU sed에서 작동하지만 대부분의 다른 sed 구현에서는 실패합니다.
wjv

@chrisdown AIX에서 처음 두 가지를 작동시키는 방법이 있습니까?
cokedude

4
$ line=foo:bar:baz:quux
$ words=$(IFS=:; set -- $line; printf "%s\n" "$@")
$ echo "$words"
foo
bar
baz
quux

4

grep이 지원 -o하면 다음과 같이 할 수 있습니다.

grep -o '[^:]\+'

또는 awk를 사용하면 레코드 구분 기호를 :다음으로 설정하십시오 .

awk -v RS=: 1

또는 GNU 컷으로 :

cut -d: --output-delimiter=$'\n' -f1-

편집하다

아래 Chris가 언급했듯이, 후행 줄 바꿈이 남습니다. awk가 RSGNU awk로 테스트 된 정규 표현식으로 지정 하는 것을 지원하면 피할 수 있습니다 .

awk -v RS='[:\n]' 1

귀하의 awk예는 (아마도 바람직하지 않은) 후행 줄 바꿈을 남깁니다.
Chris Down

@ChrisDown : RS가 정규 표현식 일 수 있다면 피할 수 있습니다.
Thor

-1

일부 문자열에서 위의 솔루션에 문제가있었습니다. 그러나 이것은 나를 위해 일했습니다 :

echo $string | sed 's/\\n/ /g' | tr " " \\n

작성된대로 이것은 OP 예제 입력을 변환하지 않습니다.
kbulgrien
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.