bash-공백을 새 줄로 바꿉니다. 얻으려면 /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 기타…

다음을 얻으려면

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

노트

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

관련 질문

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



답변

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 에 있습니다 .


답변

이 경우 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기존 답변에서 다루는 것이 가장 좋습니다.


답변

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

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 

답변

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

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

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

이것은 다소입니다 :

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

답변

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

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

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


답변

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

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

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


답변

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

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

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