백슬래시 문자로 끝나는 모든 줄을 결합하는 방법은 무엇입니까?

백슬래시 문자로 끝나는 모든 줄을 결합하는 방법은 무엇입니까?

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}'

sed의 상황은 그다지 나쁘지 않지만 awk가 확실히 더 읽기 쉽습니다.

답변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

관련 정보