特定の場所のスペースを置き換える

特定の場所のスペースを置き換える

以下のテキストファイルがあります。

データ.txt

12345678909876456    qwerty
1234567890987       qwerty
23456789011234567   qwerty

私はそれを次のように見せたい。

  1. 11番から20番を置き換えることになる。
  2. その位置間のすべてのスペースは「0」に置き換えられます。
  3. 1234で始まる行の置き換えのみを考慮する必要があります。

これまで文字列をトークン化できますが、スペースを正しく置き換えることはできません。

sed 's/^1234\(.\{6\}\)\(.\{10\}\)\(.*\)/1234\1Hi\3/' data.txt

それが私に与える結果は次のとおりです。

1234567890Hi qwerty
1234567890Hiqwerty
23456789011234567   qwerty

答え1

ほぼすべてが来ました...正規表現を少し変更し、文字列の位置11〜20がもはやSpaceではなくなるまでdo-whileループにs / / /をラップします。

sed -e '
  :loop
    s/^\(1234.\{6\}[0-9]\{0,9\}\) /\10/
  t loop
' file

12345678909876456000qwerty
12345678909870000000qwerty
23456789011234567   qwerty

答え2

また、いくつかの方法があります。

sed '
  /^1234/!b
  :1
    s/^\(.\{10,19\}\) /\10/
  t1' < file
perl -pe 'substr($_, 10, 10) =~ y/ /0/ if /^1234/' < file
perl -pe 's{^1234.{6}\K.{10}}{$& =~ y/ /0/r}e' < file
gawk -v FIELDWIDTHS='10 10 *' -vOFS= '
  /^1234/ {gsub(/ /, "0", $2)}; {print}' < file

(使用時に入力がUTF-8の場合、ロケールの文字マップでエンコードされている場合、またはASCIIの文字ごとにシングルバイトの親セットの代わりにエンコードされたと見なされる場合はオプションを追加perlします。)-C-Mopen=locale

関連情報