各行末の空白文字を「_」に置き換えます。

各行末の空白文字を「_」に置き換えます。

すべての行末のすべての空白文字を「_」に置き換えたいと思います。先行スペースについて同様の質問と回答を見つけました。しかし、末尾の空白の再構築に失敗しました。ここにリンクがあります: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()に3番目の引数を渡します。

$ 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_

関連情報