각 줄 끝의 공백 문자를 "_"로 바꿉니다.

각 줄 끝의 공백 문자를 "_"로 바꿉니다.

모든 줄 끝의 모든 공백 문자를 "_"로 바꾸고 싶습니다. 선행 공백에 대한 비슷한 질문과 답변을 찾았습니다. 하지만 후행 공백을 재구성하는 데 실패했습니다. 여기 링크가 있습니다:https://stackoverflow.com/questions/9222281/replace-leading-whitespace-with-sed-or-similar

누구든지 더 빠르고 더 나은 방법을 생각할 수 있다면 좋을 것입니다. 좋은 설명도 감사하게 생각합니다. 그렇게 하면 더 빨리 배울 수 있으니까요 :)

Input:
foo bar
 foo bar oof
  line 3a  
  line fo a

Output:
foo bar_____
 foo bar oof
  line 3a___
  line fo a_

답변1

GNU sed를 사용하여 eol의 모든 공백을 밑줄로 바꿉니다.

sed ':x;s/ \( *\)$/_\1/;tx'  

답변2

Perl을 사용하는 것이 더 효율적입니다.

perl -lpe 's/(\s+)$/"_" x length($1)/e' input.txt

반복하는 대신 각 줄을 후행 공백으로 한 번만 바꾸십시오.

답변3

GNU awk를 사용하여 match() 및 gensub()에 세 번째 인수를 전달합니다.

$ awk 'match($0,/(.*[^ ])(.*)/,a){$0=a[1] gensub(/ /,"_","g",a[2])} 1' file
foo bar_____
 foo bar oof
  line 3a___
  line fo a_

어떤 이상한 경우 :

$ awk 'match($0,/ +$/){tail=substr($0,RSTART,RLENGTH); gsub(/ /,"_",tail); $0=substr($0,1,RSTART-1) tail} 1' file
foo bar_____
 foo bar oof
  line 3a___
  line fo a_

위의 gawk 솔루션을 적용하여 선행 공백을 바꾸려면 다음을 수행하십시오.

$ awk 'match($0,/^( *)(.*[^ ])(.*)/,a){$0=gensub(/ /,"_","g",a[1]) a[2] gensub(/ /,"_","g",a[3])} 1' file
foo bar_____
_foo bar oof
__line 3a___
__line fo a_

답변4

시도하고 싶다면다음에 추가공백은 줄을 균일하게 만듭니다.

$ cat -A file
foo bar$
 foo bar oof$
  line 3a  $
  line fo a$

고르지 못한 선

perl -MList::Util=max -lne '
    push @lines, $_
}
END {
    $wid = max map {length} @lines;
    for $line (@lines) {
        $padded = sprintf "%-*s", $wid, $line;
        $padded =~ s/(\s+)$/"_" x length($1)/e;
        print $padded
    }
' file
foo bar_____
 foo bar oof
  line 3a___
  line fo a_

관련 정보