我有一个模式
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
解决方案都依赖于这样一个事实:我们可以在字符串中使用:
和作为临时“占位符字符”,并且这些字符不会出现在字符串中的其他位置。@