我已经编写了一个替换字符串的脚本,但我需要添加回 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
使用 ( ... ) 从左侧正则表达式捕获组.
级联" "
文字空间x 10
乘法(10 次)/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 中工作。