텍스트 파일에서 들여쓰기 제거

텍스트 파일에서 들여쓰기 제거

다음과 같은 텍스트가 있습니다.

    it's like a foo.
     it's like a bar.
        it's like a bar.
  it's like a foo.

첫 번째 줄의 들여쓰기나 공백을 제거하고 다음 줄에서도 같은 양의 들여쓰기나 공백을 제거하고 싶습니다.

후속 줄의 공백이나 들여쓰기가 첫 번째 줄보다 적으면 모든 선행 공백이나 들여쓰기가 제거됩니다.

출력은 다음과 같습니다

it's like a foo.
 it's like a bar.
    it's like a bar.
it's like a foo.

답변1

사용 expand(TAB을 SPC로 확장, 탭이 8열마다 중지된다고 가정, 다른 공백 문자는 고려되지 않음) 및 다음을 사용 awk하십시오.

<your-file expand | awk -F '[^ ]' '
  NR == 1 {n = length($1)}
  {sub("^ {1,"n"}", ""); print}'

답변2

사용 perl:

$ perl -pe 'if($.==1){s/^(\s+)//; $s=length($1);}else{s/^\s{0,$s}//}' file
it's like a foo.
 it's like a bar.
    it's like a bar.
it's like a foo.

원본 파일을 직접 편집하려면 다음을 사용하십시오 -i.

perl -i -pe 'if($.==1){s/^(\s+)//; $s=length($1);}else{s/^\s{0,$s}//}' file

답변3

Python 인터프리터를 시작해야 한다는 것은 기분이 좋지 않지만 옵션이기도 합니다:

python -c "import textwrap,sys; print(textwrap.dedent(sys.stdin.read()))" < myfile

답변4

sed몇 가지 준비 작업만으로 이를 수행할 수 있습니다 .

n=$(( $(sed -n '1s/[^[:space:]].*//; p; q' file | wc -c) - 1 ))
sed 's/^[[:space:]]\{1,'"$n"'\}//' file

첫 번째 줄에서는 $n변수( )를 파일의 첫 번째 줄에 있는 선행 공백 수로 설정합니다. 표시되는 바이트 수에는 wc개행 문자가 포함되므로 이에 대해 1을 뺍니다. 두 번째 줄에서는 구문을 사용 sed하여 줄 시작 부분의 공백을 가변 크기(1 ~ )만큼 제거하는 표현식을 실행합니다 .$n\{n,m\}

귀하의 sed는 "in-place" 편집 옵션( -i)을 지원할 수 있습니다.

관련 정보