用换行符替换几个字符

用换行符替换几个字符

我有一个包含如下数据的文件:

0.5, 14, 14, 12, 1.000000736101224E-11, -- 0.5, 14, 14, 14, 9.999999999999996E-12,

如何, --用换行符替换?

我尝试过sed 's/,\ --/\n/',但没有成功。

答案1

在 seds///命令中强制添加换行符可能会很棘手。

假设您还想整理 之前和之后的空格--,awk 是一个不错的选择:

$ awk -F' *-- *' -v OFS='\n' '{$1=$1}1' file
0.5, 14, 14, 12, 1.000000736101224E-11,
0.5, 14, 14, 14, 9.999999999999996E-12,

$1=$1是一个 awk 习惯用法,强制使用不同的字段分隔符重写当前记录。

答案2

使用 GNU sed

$ gsed 's/, -- /\n/' file
0.5, 14, 14, 12, 1.000000736101224E-11
0.5, 14, 14, 14, 9.999999999999996E-12,

然而,标准sed不允许使用该s命令插入换行符,但您可以利用这样一个事实:从保留空间追加将添加模式空间的换行符:

$ sed 'h;s/, -- .*//;G;s/\(\n\).*, -- /\1/' file
0.5, 14, 14, 12, 1.000000736101224E-11
0.5, 14, 14, 14, 9.999999999999996E-12,

这会将模式空间(行)复制到保留空间h,然后删除最后一位,以便仅保留“第一行”。然后,它将原始数据的副本附加到模式空间,并使用嵌入的换行符作为分隔符G。换行符和我们视为分隔符的模式之间的位将被换行符替换,并打印结果。

对于非 GNU 来说,很可能有一种更优雅的方法来做到这一点sed

答案3

@glenn jackman 和 @Kusalananda 是正确的,在替换字符串中使用换行符有一个技巧sed。是的,这是非 GNU sed (BSD)。

技巧是引用 -e 标志的参数部分,因为参数包含换行符。技巧的第一部分是使用引号允许将文字换行符放入 -e 替换标记中;第二部分是这样的换行符需要对 进行反斜杠转义sed。在脚本语法中,它看起来像:

sed -Ee "s/, +-- +/\\
/" < test.txt

在命令行手动输入(并带有bash继续提示符>),它看起来更像:

$ sed -Ee "s/, +-- +/\\
> /" < test.txt
0.5, 14, 14, 12, 1.000000736101224E-11
0.5, 14, 14, 14, 9.999999999999996E-12,

在引号内,双反斜杠转换为单反斜杠,因为 sed 需要(字面意思?)替换字符串中的换行符进行反斜杠转义。如果没有双反斜杠,你会看到它抱怨:

$ sed -Ee "s/, +-- +/  
/" < test.txt
sed: 1: "s/, +-- +/
/
": unescaped newline inside substitute pattern

答案4

使用 sed 命令,它对我来说效果很好

命令

echo "0.5, 14, 14, 12, 1.000000736101224E-11, -- 0.5, 14, 14, 14, 9.999999999999996E-12,"| sed "s/, -- /\n/g" 

输出

0.5, 14, 14, 12, 1.000000736101224E-11
0.5, 14, 14, 14, 9.999999999999996E-12,

相关内容