다음과 같은 입력에서 공백을 새 줄로 바꾸려면 어떻게해야합니까?
/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
으로 입력에 개행을 추가 한다는 사실을 이용합니다 .