替换某些位置的空格

替换某些位置的空格

我有一个如下的文本文件。

数据.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

你几乎就在那里......对你的正则表达式进行了轻微的改变,加上将 s/// 封装在 do-while 循环中,直到从 11 到 20 的字符串位置不再有空格。

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 或被视为在区域设置的字符映射中进行编码,则perl添加-C选项 或 ,而不仅仅是 ASCII 的每个字符超集的单字节)。-Mopen=locale

相关内容