我有一个包含如下数据的文件:
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,