새 줄 \n과 다가오는 + 기호를 공백으로 바꾸는 방법

새 줄 \n과 다가오는 + 기호를 공백으로 바꾸는 방법

새 줄 \n과 향후 + 기호를 공백으로 바꿉니다.

입력 파일

ABC

+ DEF



foo

+ bar

출력은 다음과 같아야합니다.

ABC   DEF


foo  bar

답변1

파일에 +다음과 같이 다른 모든 줄이 a로 시작하는 교대 패턴만 포함된 경우

ABC
+ DEF
foo1
+ bar1
foo2
+ bar2

그런 다음 사용

$ sed 'N;s/\n+  */ /' file
ABC DEF
foo1 bar1
foo2 bar2

이것은 단지 한 줄을 읽고 다음 줄을 추가합니다( 사용 N). 그런 다음 삽입된 개행 문자 N, 더하기 기호 및 그 뒤의 공백을 단일 공백으로 바꿉니다.


파일이 다음과 같다고 가정해 보겠습니다.아니요빈 줄(빈 줄은 없는 줄로 처리됩니다 +). 첫 번째 줄은 더하기 기호로 시작할 수 없지만 마지막 줄은 더하기 기호로 시작됩니다.추정더하기 기호로 시작하세요.

ABC
+ DEF
foo1
+ bar1
+ baz1
foo2
+ bar2

다음 sed스크립트는 이를 다음으로 변환합니다.

ABC DEF
foo1 bar1 baz1
foo2 bar2

스크립트:

# This is the first line
1 {
    h;      # Save the line in the hold space.
    d;      # Delete and start next cycle.
}

# This line starts with a plus sign and at least one space.
/^+  */ {
    s///;   # Delete the plus sign and the space(s).
    H;      # Append to hold space with embedded newline.
    $ !d;   # Delete and start next cycle (except for on the last line).
}

# This line of input starts a new set of lines.
# Output accumulated line.
x;          # Swap with hold space.
y/\n/ /;    # Replace all embedded newlines with spaces
            # (implicit print)

다음과 같이 사용할 수 있습니다.

sed -f script.sed file

"한 줄"로:

sed -e '1{h;d;}' -e '/^+  */{s///;H;$!d;}' -e 'x;y/\n/ /' file

답변2

Perl을 사용하면 전체 파일을 넣고 <newline><plus><space>시퀀스를 직접 바꿀 수 있습니다.

$ cat foo.txt
ABC
+ DEF
foo1
+ bar1
+ baz1
foo2
+ bar2
$ perl -0777 -pe 's/\n\+ ?/ /g' < foo.txt
ABC DEF
foo1 bar1 baz1
foo2 bar2

(위 정규식은 더하기 기호 뒤의 선택적 공백을 제거합니다)

답변3

에 대해 문자열이나 정규식 사용을 지원하는 gawkor 를 사용하면 모든 것이 훨씬 간단해집니다.mawkRS

$ awk -vRS='\n[+]' -vORS= 1

또는 OP의 예에서처럼 여러 개의 빈 줄을 건너뛰기를 원하는 경우:

$ awk -vRS='\n+[+]' -vORS= 1 OPs_file
ABC DEF



foo bar

이렇게 하면 메모리에 두 개 이상의 행이 로드되지 않으며 첫 번째 행이 +.

답변4

위에서 언급한 명령을 사용하지 않고 아래 명령을 수행하여 수행했습니다.

방법 1

sed '/^$/d' filename|sed "s/[^A-Za-z]//g"|perl -pne "s/\n/ /g"| awk '{print $1,$2"\n"$3,$4}'

output
ABC DEF
foo bar

두 번째 방법

step1:

    p=`cat y.txt| sed '/^$/d'| sed "s/[^A-Za-z]//g"| awk '{print NR}'| sort -rn| sed -n '1p'`


step2:

    for ((i=1;i<=$p;i++)); do cat y.txt| sed '/^$/d'|sed -n ''$i'{p;n;p}'| sed "N;s/\n/ /g";i=$(($i+1)); done| sed "s/[^a-zA-Z]/ /g"


output
ABC   DEF
foo   bar

관련 정보