GNU/Linux >> Linux の 問題 >  >> Linux

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

GNU sed では、eol のすべてのスペースをアンダースコアに置き換えます:

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

perl を使用するとより効率的です:

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

ループする代わりに、末尾の空白を使用して行ごとに 1 つの置換を行うだけで済みます。


match() と gensub() の 3 番目の引数に GNU awk を使用:

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

awk:

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

Linux
  1. screenieを使用したコマンドラインでのマルチタスク

  2. Vimの各行の先頭にテキストを挿入する方法

  3. 行の範囲を行の範囲(sedまたはその他)に置き換えますか?

  1. Wcで各行の文字を数えますか?

  2. Sedの行末に単語を追加しますか?

  3. 最後を除くすべての改行をスペースに置き換えますか?

  1. コマンドラインでsortを使用してソートする

  2. Vimでファイルの最初または最後に移動する[クイックヒント]

  3. MAC アドレスを UUID に置き換えます