sed 백스페이스로 교체

sed 백스페이스로 교체

나는 넷리스트를 trail.txt포함하는 을 가지고 있습니다. spice이제 모든 확장 매개변수를 단 한 줄로 바꾸고 싶습니다. 즉, +해당 줄을 제거하고 이전 줄에 추가합니다.

추적.txt

data
+ net06706 net06707
+ net221 net222 net223 
m1 net10 rwl vdda vss nch l="l1pg+0.005u" w=w1pg+0.105u 
m0 vdda rwld net10 vss nch l="l1pg+0.005u" w=w1pg+0.105u 

(필수)trail.txt

data net06706 net06707 net221 net222 net223 
m1 net10 rwl vdda vss nch l="l1pg+0.005u" w=w1pg+0.105u 
m0 vdda rwld net10 vss nch l="l1pg+0.005u" w=w1pg+0.105u 

주문하다

sed -e 's/^+/\b/g' trail.txt

교체를 시도했지만 성공하지 못했습니다 +. backspace이 문제를 해결할 다른 방법이 있나요? 다른 대안이 있나요?

답변1

백스페이스 방법을 사용할 수 없을 것 같지만 다음과 같은 작업을 수행할 수 있습니다.

sed -e :a -e '$!N;s/\n+/ /;ta' -e 'P;D' trail.txt

바라보다유명한 Sed 전문 용어 설명, 1부: 파일 간격, 번호 매기기, 텍스트 변환 및 교체,40. 이전 줄이 등호 "="로 시작하는 경우 이전 줄 뒤에 줄을 추가합니다.(분명히 로 대체됨 +) =.

답변2

FWIW, GNUawk

awk -vRS='\\n\\+?' '{ORS=RT == "\n+"? "":RT; print}' trail.txt
data net06706 net06707 net221 net222 net223
m1 net10 rwl vdda vss nch l="l1pg+0.005u" w=w1pg+0.105u
m0 vdda rwld net10 vss nch l="l1pg+0.005u" w=w1pg+0.105u

답변3

sed를 사용하는 것은 약간 까다로울 수 있으므로 몇 가지 아이디어가 있습니다.

perl -00 -pe 's/\n\+\s*/ /g' file
awk '
    {
        if (/^\+/) 
            sub(/^\+[[:blank:]]*/, " ", $0)
        else 
            if (NR > 1) print ""
        printf "%s", $0
    } 
    END {print ""}
' file 

답변4

GNU sedperl다음과 같은 간단한 작업 에는 허용되지 않습니다 .

sed -z 's/\n+//g' trail.txt

관련 정보