Sed 在匹配的模式后添加文本

Sed 在匹配的模式后添加文本

我有一个模式

62G   57G  52% 

我想将它们放在单独的行中,并且
在第一个匹配的 G Free 之后,
在第二个Used 之后
,在第三个 Utilized 之后

所以它应该看起来像这样

62G Free 
57G Used  
52% Utilised 

答案1

假设您的数据位于名为 的文件中file,以下命令将读取该文件的每一行并按照您指定的格式输出其三列:

$ awk '{ printf("%s Free\n%s Used\n%s Utilised\n", $1, $2, $3) }' file
62G Free
57G Used
52% Utilised

对于每一行输入,代码中的块都会被执行。该块包含一个printf()语句,该语句将三个空格分隔的列格式化为三行并添加了文本。

这样做并非sed不可能,但不必要地困难:

$ sed -e 's/[[:blank:]][[:blank:]]*/:/g' -e 's/:/ Free@/' -e 's/:/ Used@/' -e 's/%/% Utilised/' -e 'y/@/\n/' file
62G Free
57G Used
52% Utilised

这将首先将所有空白字符压缩为单个字符,然后通过逐一:替换这些字符来插入所需的添加文本字符串。:插入时,我们还会@在以后想要插入换行符的位置添加字符。最后一步,我们将所有插入的@字符更改为换行符。

请注意,使用 GNU sed,它允许在命令\n的替换部分中使用s///,您可以使其更短:

$ gsed -E -e 's/[[:blank:]]+/:/g' -e 's/:/ Free\n/' -e 's/:/ Used\n/' -e 's/%/% Utilised/' file
62G Free
57G Used
52% Utilised

这两种sed解决方案都依赖于这样一个事实:我们可以在字符串中使用:和作为临时“占位符字符”,并且这些字符不会出现在字符串中的其他位置。@

相关内容