将第一个词改为sed,保持空格对齐。

问题描述 投票:0回答:1

我想写一个Shell脚本来编辑一个输入文件。输入文件中的数据结构如下。

1000␣␣␣␣␣␣␣␣␣␣␣␣: final time
1000            : print time
0.1             : time step

在第一行中用白格进行对齐,我目前使用的是 sed 来替换参数(每行的第一个 "字")。

我找不到一个不影响标签对齐的方法。我愿意听取任何建议,我并不是特别想通过使用 sed. 例如,可以通过使用标签来改变输入文件的结构。

下面是我想让脚本做的一个例子。

input file
----------
1000␣␣␣␣␣␣␣␣␣␣␣␣: final time
1000            : print time
0.1             : time step
running the script
------------------
$ script --final-time=100
input file after running the script
-----------------------------------
100␣␣␣␣␣␣␣␣␣␣␣␣␣: final time
1000            : print time
0.1             : time step

替换字符串的长度是事先不知道的. 它不是固定的,最多可以是6个字符。

sed replace whitespace
1个回答
0
投票

使用 GNU awk。

awk -v value="100" 'BEGIN{FS=OFS=" : "} $2=="final time" {$1=sprintf("%-15s",value)}1' file

輸出: 100 : final time1000 : print time 0.1 : time step

100:最终时间1000:打印时间0.1:时间步长。

请看。8个强大的Awk内置变量 - FS, OFS, RS, ORS, NR, NF, FILENAME, FNR。


0
投票

这可能对你有用(GNU sed)。

sed -E '/final time/{s/.*/\n&\n100/;:a;s/\n[^:](.*\n)(.)/\2\n\1/;s/\n[^:](.*\n)$/ \n\1/;ta;s/\n//g}' file

在概览中,每次用一个字符的替换值替换第一个字段,如果替换字符串较短,确保用空格覆盖原始值。

如果行中包含了所需的匹配值,则在模式空间的开始处加上一个新行,在模式空间的结尾处加上一个新行,然后再加上所需的替换字符串。

在一个循环内:如果第一个换行符后面的第一个字符不是冒号 : 即表示第一个字段与第二个字段分离的字符,用第二个换行符后面的第一个字符代替,并将第一个换行符替换在替换字符后面。如果第二个换行符后面没有字符,而且第一个换行符后面的第一个字符既不是空格也不是冒号,则用空格代替,并再次对第一个换行符进行洗牌。否则,替换成功,并删除所有引入的新行。

© www.soinside.com 2019 - 2024. All rights reserved.