ファイルの場所の前にスペースを追加する

ファイルの場所の前にスペースを追加する

私のファイルに文字列があります。

7017556626 TEST BSAB 20191108 TEST123 3333 1111 BSAB 11
7007760674 TESTCHAS 20191108 TEST123 4444 5555 CHAS 22
7017556626 TEST      20191108 TEST123 3333 1111 CHAS 33
7017556626 TEST SSEQ 20191108 TEST123 2222 7777 BSAB 44
7007760674 TESTCHAS 20191108 TEST123 1111 0000      55

場所16の前にスペースを追加する必要があります。

7017556626 TEST BSAB 20191108 TEST123 3333 1111 BSAB 11
7007760674 TEST CHAS 20191108 TEST123 4444 5555 CHAS 22
7017556626 TEST      20191108 TEST123 3333 1111 CHAS 33
7017556626 TEST SSEQ 20191108 TEST123 2222 7777 BSAB 44
7007760674 TEST CHAS 20191108 TEST123 1111 0000      55

どうすればいいですか?

答え1

GNU sed拡張モードでは:

sed -Ee 's/^(.{15})([^ ])/\1 \2/' file

別の方法を使用してくださいGNU sed

sed -e '
   h         ; # hold a copy in case we need it
   s/./\n&/16; # place a marker before the 16-char in the current line
   /\n /g    ; # in case the marker sees a space to its right, revert the changes
   s/\n/ /   ; # in case not then remove the marker
' file

そしてPerl

perl -lpe '$_ = "@{[unpack q[A15A*]]}" if index($_," ",15) != 15' file

結果:

7017556626 TEST BSAB 20191108 TEST123 3333 1111 BSAB 11
7007760674 TEST CHAS 20191108 TEST123 4444 5555 CHAS 22
7017556626 TEST      20191108 TEST123 3333 1111 CHAS 33
7017556626 TEST SSEQ 20191108 TEST123 2222 7777 BSAB 44
7007760674 TEST CHAS 20191108 TEST123 1111 0000      55

答え2

〜のようにsed、スクリプト可能なエディタを使用できますed

printf '%s\n' '1,$s/^\(.\{15\}\)\([^ ]\)/\1 \2/' 'wq' | ed -s file

これは、「自動」モードでedに2つの改行文字で区切られたコマンドを送信します。

  1. 1,$s/^\(.\{15\}\)\([^ ]\)/\1 \2/- 各行(1,$1行から最後の行まで)で検索と置換を実行します。行の先頭(^)から、空白以外の文字が続く15文字を検索します。見つかった場合、最初の15文字はサブ式#1にグループ化され、空白以外の文字はサブ式#2にグループ化されます。そのテキストを空白のサブ式#1に置き換え、サブ式#2に置き換えます。デフォルトでは、次の文字が空白でない場合は、15番目の文字の後にスペースを配置します。
  2. wq- ファイルをディスクに書き戻して終了します。ed

答え3

そしてawk

awk 'substr($0,16,1) != " " { $0=substr($0,0,15)" "substr($0,16) }1' file

16番目の文字列が空白文字でない場合は、現在の行をプレフィックス、スペース文字、サフィックスに変更します。次に、現在の行(1)を印刷します。

関連情報