bash-공백을 새 줄로 바꿉니다.


70

다음과 같은 입력에서 공백을 새 줄로 바꾸려면 어떻게해야합니까?

/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5 기타...

다음을 얻으려면

/path/to/file
/path/to/file2
/path/to/file3
/path/to/file4
/path/to/file5

노트

다른 사용자를 돕기 위해이 질문을 게시하고 있는데,이 질문을 입력하기 전까지는 UNIX SE에서 유용한 답변을 찾기가 쉽지 않았습니다. 그 후 나는 다음을 발견했다.

관련 질문

새 줄을 찾아서 바꾸려면 어떻게해야합니까?



ls / path / to / | xargs 에코 | SED의 / \ S \ + / \ n / g '
— SD.

답변:


125

tr명령을 사용하십시오

echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5"\
| tr " " "\n"

http://www.unix.com/shell-programming-scripting/67831-replace-space-new-line.html 에 있습니다 .


1
tr은 저의 첫 생각이기도했지만, 그렇게하는 방법은 너무 많습니다! 그러나 이것은 정확히 무엇입니까 tr!
— Rob

5
+1, 그러나 주석으로 : 파일 이름에 공백이 있으면 작동하지 않습니다
— Bonsi Scott

20

이 경우 printf를 사용합니다.

printf '%s\n' /path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5

공간이있는 경우 내 경로의 하나가, 당신은 공간에 분리되는 것을 방지하기 위해 그 파일 경로를 인용 수 있습니다 :

printf '%s\n' /path/to/file '/path/to/file with spaces' /path/to/another/file

일반적으로 텍스트를 변환하려면 tr기존 답변에서 다루는 것이 가장 좋습니다.


1
미래에 대한 간단한 설명 :이 솔루션을 게시 해 주셔서 감사합니다. "echo"를 사용하는 것과 비교하여 매우 신뢰할 수 있습니다.
— Liesmith

5

공백을 구분자로 사용하는 문자열이 있다고 가정합니다.

newline_separated=${space_separated// /$'\n'}

그러나 아마도 잘못된 질문을하고있을 것입니다. 공백으로 구분 된 파일 이름 목록이 실제로 작동하지 않습니다. 파일 이름 중 하나에 공백이 있으면 어떻게됩니까?

프로그램이 파일 이름을 인수로 받으면 공백으로 조인하지 마십시오. "$@"하나씩 액세스하는 데 사용하십시오 . echo "$@"사이에 공백이있는 인수를 인쇄 하지만 그 이유 echo는 공백으로 구분 기호로 인수를 인쇄합니다. somecommand "$@"파일 이름을 별도의 인수로 명령에 전달합니다. 인수를 별도의 줄에 인쇄하려면 다음을 사용할 수 있습니다.

printf '%s\n' "$@"

공백으로 구분 된 파일 이름이 있고이를 처리하기 위해 배열에 넣으려는 경우 인용되지 않은 변수 확장을 사용하여 문자의 값을 분할 할 수 있습니다 IFS( set -f그렇지 않은 경우에는 glob 패턴은 값에서 확장됩니다) :

space_separated_list='/path/to/file1 /path/to/file2 /path/to/file3'
IFS=' '; set -f
eval "array=(\$space_separated_list)"
for x in "${array[@]}"; do …

-f설정과 IFS완료 시점 의 값 을 복원하는 함수로 이것을 캡슐화 할 수 있습니다 .

split_list () {
  local IFS=' ' flags='+f'
  if [[ $- = *f* ]]; then flags=; fi
  set -f
  eval "$1=($2)"
  set $flags
}
split_list array '/path/to/file1 /path/to/file2 /path/to/file3'
for x in "${array[@]}"; do …

이것에 대한 정답 변경. 공백으로 구분 된 목록에 어떻게 도달했는지 연구하고 다른 방법으로 해당 정보를 검색하는 것이 더 정확하다고 생각합니다. 스 니넷에 약간의 주석을 달고 로컬 var IFS 또는 $-= f do 조건과 같은 작업을 알려 주면 나와 같은 학습자에게 좋을 것 입니다. 배쉬를 몇 번 사용하는 사람이 모르는 그런 것들.
— laconbass

@laconbass 간단한 설명을 추가했습니다. 조회 set -f및 IFSbash는 설명서에 모든 세부 사항을합니다. 참조 unix.stackexchange.com/questions/16192/...
— 질

@Guilles 그 짧은 설명은 나에게 충분하며, 다른 많은 사람들에게도 도움이 될 것이라고 생각합니다. 당신의 시간을위한 타이
— laconbass

IFS로컬 설정 은 적용되지 않습니다
— Eliran Malka

@EliranMalka 나는 이것이 무엇을 의미하는지 전혀 모른다. 스크립트가 생각한대로 동작하지 않으면 여기에서 질문 할 수 있습니다.
— Gilles

4

실용적으로 sed를 사용하십시오!

sed 's/\s\+/\n/g' file

위에서 하나 이상의 공백 문자 (\ s +)를 줄 바꿈 (\ n)으로 바꾸라고합니다.

이것은 다소입니다 :

'substitute /one space or more/ for /newline/ globally'

1
변경을 대체로 대체하십시오. 이것이 실제로 의미합니다!
— Rob

@Rob 감사합니다. 다른 답변을 편집 할 수 있습니다.
— MGP

1
텍스트 사이에 공백이 여러 개 있으면 빈 줄이 생깁니다. \ s 뒤에 '+'를 추가하여 정확히 하나의 공백이 아닌 하나 이상의 공백을 일치시키려는 것을 표시해야합니다. 즉. SED의 / \ S + / \ n / g '
— DarkHeart

4

tr@laconbass 의 대안 xargs으로이 경우 에도 사용할 수 있습니다 .

echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4  /path/to/file5"\
| xargs -n1

장점은 여러 공백으로도 작동하지만 tr그렇지 않은 것입니다.


0

내가 한 방법은 다음과 같습니다.

echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5" | sed 's/ /\
'/g

sed명령 에서 백 슬래시 다음에 Enter 키를 사용하십시오 .


무엇 prons 양론이 sed이상 tr?
— laconbass

당신의 편안함 수준 :-) sed단순히 문자를 번역하는 것이 아니라 편집기이기 때문에 더 많은 것을 할 수 있다고 생각합니다 .
— unxnut

4
sed훨씬 더 많은 것을 할 수 있지만, 이것에 대해 완전히 과잉입니다. tr이 작업에 적합한 도구이지만 sed, 정규 지식 과 정규식은 나중에 유용 할 것입니다!
— Rob

0

라인이 다음과 같은 변수에 있다고 가정하면 다른 접근 방식은 다음과 line같습니다.

for path in $line;do echo $path;done

이것은 Bash가 기본적으로 인수를 공백으로 나누고 기본적 echo으로 입력에 개행을 추가 한다는 사실을 이용합니다 .


이 질문을 게시하기 전에 우분투 시스템에서 시도했지만 작동하지 못했습니다.
— laconbass

0
echo word1 word2 ... | sed -e 'y/ /\n/;P;D'

단일 공백으로 구분 된 단어를 줄 바꿈으로 분리하는 또 다른 방법입니다.


-1

다음 스크립트는 이해하기 쉽고 사용하기 쉽습니다.

cat filename | tr ' ' '\n' | tee filename

2
답변의 본질 ( tr)은 수락 된 답변과 동일합니다. 대답에는 다음과 같은 문제 cat가 있습니다 < filename tr ' ' '\n'. c) 출력 파일 이름은 입력 파일 이름과 같습니다. 이를 통해 데이터 레이스를 만듭니다.
— maxschlepzig 2018 년

1
maxschlepzig의 정확한 분석과는 별도로, 이것은 스크립트가 아니라 하드 코딩 된 이름을 가진 여러 개의 연결된 명령입니다. 저의 가족 중 3 명 중 2 명은 이해하기 쉽지 않습니다. 어쩌면 그것은 대표적인 것이 아니지만, 자신이 이해하는 (또는이 경우 이해한다고 생각하는) 항상 쉬운 것처럼 보인다는 것을 명심하십시오.
— Anthon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.