linux - 如何用sed替换静态位置的字符串并且不删除空格

标签 linux bash sed

我尝试为模板创建脚本。在此,我想替换静态位置上的字符串。但是在第一次 sed 尝试之后,默认字符串已损坏。

我的脚本:

#!/bin/sh
# default record
record="NNNNNNNNNNNNNNNNNNNN CCCCCCCCCCCCCCCCCCCC BBBBBBBBBB 001"
echo "$record"

# read values from configuration file
VAR1="User Name:     Sibob" # 20
VAR2="              Berlin" # 20
VAR3="1983  [US]" # 10

record=`echo $record | sed -e "s/\(.\{0\}\)\(.\{20\}\)/\1$VAR1/" `
echo "$record"
record=`echo $record | sed -e "s/\(.\{21\}\)\(.\{20\}\)/\1$VAR2/" `
echo "$record"
record=`echo $record | sed -e "s/\(.\{54\}\)\(.\{10\}\)/\1$VAR3/" `
echo "$record"

脚本的结果是:

$ ./rename.sh
NNNNNNNNNNNNNNNNNNNN CCCCCCCCCCCCCCCCCCCC BBBBBBBBBB 001
User Name:     Sibob CCCCCCCCCCCCCCCCCCCC BBBBBBBBBB 001
User Name: Sibob CCCC              BerlinBBBBBBB 001
User Name: Sibob CCCC BerlinBBBBBBB 001
User Name: Sibob CCCC BerlinBBBBBBB 001

但我想要的是:

User Name:     Sibob               Berlin  1983 [US] 001

问题是,空白将被删除。在这种情况下,字符串的替换无法正常工作。

有人有想法吗?

最佳答案

听起来你应该简单地使用 printf 来代替。

printf '%20s %-20s %10s %03i\n' "$VAR1" "$VAR2" "$VAR3" "1"

如果您坚持使用 sed,您仍然可以使用 printf 来生成必要的填充,尽管将您的代码重构为 Awk 脚本可能是前进的最佳途径.

直接的问题是您没有引用 echo 的参数,这会导致 shell 对值执行空格标记化和通配符扩展,有效地压缩值中的任何空格。

关于linux - 如何用sed替换静态位置的字符串并且不删除空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38459181/

相关文章:

regex - sed 头痛 : inserting lines upon singular matches in file (NOT per line)

linux - xargs + curl "Failed writing body"(不能将多个结果保存到文件)

c - 当没有数据可读取时,Socket read() 会挂起一段时间

python - 找出每个 clientId 的新旧映射之间的差异

regex - Sed 替换双引号中的变量

linux - 在 shell 脚本中执行 make 命令的正确方法是什么?

linux - 将标准输出作为命令行工具的文件名传递?

linux - Linux 上的 Qt 4.8.3 GUI 应用程序看起来很旧并且与设计器预览不匹配

linux - sed - 删除两个空行之前的文本

bash - Homebrew 软件,-bash : qemu: command not found OSX El Capitan