使用 sed 添加 10 个空白字符

使用 sed 添加 10 个空白字符

我已经编写了一个替换字符串的脚本,但我需要添加回 10 个空白字符。我按 10 次空格键将其添加回来,这样就可以了,但这在我的脚本中看起来很可怕。

我的脚本: sed -i 's/server.os[ \t]*$freebsd/server.os $linux/g' ~/var/log.txt

我想在server.os和之间添加 10 个空格字符,$linux使用类似{whitespace*10}

笔记:

  • 前面有 10 个空格字符,$freebsd这就是我使用的原因[ \t]*
  • $在这种情况下不是变量。它只是字符串的一部分。

输入示例: server.os $freebsd

期望的输出: server.os $linux

答案1

捕获任何内容(十个、更多、更少或没有) 组中原始字符串中的连续空格和制表符([ \t])...然后按其转义引用编号将其放回替换字符串中,\1在这种情况下,如下所示:

sed -E 's/server\.os([ \t]*)\$freebsd/server.os\1$linux/g'

注意:您需要转义.and,$因为左侧的所有内容都被视为正则表达式。

答案2

如果您需要捕获已经存在的空白(新用例):

$ sed 's/\(server.os[ \t]*\$\)freebsd/\1linux/' file
server.os          $linux

如果您需要创建不存在的空间(旧用例):

输入文件:

$ cat file
server.os $freebsd

sed根据要求使用 GNU :

风险由您自行承担。

sed -E 's/(server\.os[ \t]*\$)freebsd.*/printf "%s%10s" \1 linux/e' file

Perl

$ perl -pe 's/(server\.os)[ \t]*\$freebsd.*/$1 . " " x 10 . "linux"/e' file
server.os           $linux

如果您使用-i,它的行为如下sed -i:它替换排队

替换部件的工作原理如下:

  1. $1使用 ( ... ) 从左侧正则表达式捕获组
  2. .级联
  3. " "文字空间
  4. x 10乘法(10 次)
  5. /e允许传递 Perl 代码/函数/表达式的修饰符(是的,它非常强大

答案3

source_txt='server.os[ \t]*$freebsd'
replace_txt=$(printf 'server.os%10s$linux')
sed -i "s/$source_txt/$replace_txt/g" ~/var/log.txt

printf此处用于创建格式化文本。看手册页求助。它是一个内置的 shell 和 POSIX。应该可以在所有 shell 中工作。

相关内容