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 -fIFSbash는 설명서에 모든 세부 사항을합니다. 참조 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.