我尝试为模板创建脚本。在此,我想替换静态位置上的字符串。但是在第一次 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/