sed 또는 awk와 같은 일반적인 명령줄 도구를 사용하여 백슬래시와 같은 특정 문자로 끝나는 모든 줄을 연결할 수 있습니까?
예를 들어 다음 파일이 있다고 가정해 보겠습니다.
foo bar \
bash \
baz
dude \
happy
나는 다음과 같은 출력을 얻고 싶습니다.
foo bar bash baz
dude happy
답변1
더 짧고 간단한 sed 솔루션:
sed '
: again
/\\$/ {
N
s/\\\n//
t again
}
' textfile
GNU를 사용하는 경우 한 줄 sed
:
sed ':x; /\\$/ { N; s/\\\n//; tx }' textfile
답변2
아마도 Perl을 사용하는 것이 가장 쉬울 것입니다(Perl은 sed 및 awk와 유사하므로 이를 수락하시기 바랍니다).
perl -p -e 's/\\\n//'
답변3
이것은 awk 솔루션입니다. 줄이 로 끝나면 \
백슬래시를 제거하고 줄 바꿈 없이 줄을 인쇄합니다. 그렇지 않으면 줄 바꿈을 사용하여 줄을 인쇄합니다.
awk '{if (sub(/\\$/,"")) printf "%s", $0; else print $0}'
답변4
또 다른 일반적인 명령줄 도구 ed
는 기본적으로 파일을 내부에서 수정하므로 파일 권한을 수정하지 않습니다(자세한 내용은 ed
다음을 참조하세요).스크립트에서 편집 텍스트 편집기를 사용하여 파일 편집)
str='
foo bar \
bash 1 \
bash 2 \
bash 3 \
bash 4 \
baz
dude \
happy
xxx
vvv 1 \
vvv 2 \
CCC
'
# We are using (1,$)g/re/command-list and (.,.+1)j to join lines ending with a '\'
# ?? repeats the last regex search.
# replace ',p' with 'wq' to edit files in-place
# (using Bash and FreeBSD ed on Mac OS X)
cat <<-'EOF' | ed -s <(printf '%s' "$str")
H
,g/\\$/s///\
.,.+1j\
??s///\
.,.+1j
,p
EOF