다음과 같은 텍스트가 있습니다.
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
)을 지원할 수 있습니다.