sed替换,增加了换行符

时间:2017-06-16 04:46:09

标签: shell sed

我有像

这样的字符串
990202-1711-BBVRS390-T01
415715-1611-EDUE818C,1711-EDUE818C
415715-1611-EDUE818C-,1711-EDUE818C-T01

我想用换行符和前7个字符替换all,以便输出

990202-1711-BBVRS390-T01
415715-1611-EDUE818C
415715-1711-EDUE818C
415715-1611-EDUE818C-
415715-1711-EDUE818C-T01

5 个答案:

答案 0 :(得分:1)

以下是awk apporach:

awk '{firstSeven=substr($0,1,7);gsub(/,/,RS firstSeven)}1' inputfile
990202-1711-BBVRS390-T01
415715-1611-EDUE818C
415715-1711-EDUE818C
415715-1611-EDUE818C-
415715-1711-EDUE818C-T01

Exaplanation:

substr功能:此功能用于获取前七个字符。从第1个字符到第7个字符。
gsub函数:此函数用于用新行替换逗号,后跟firstSeven字符。此处RS用于获取新行,因为RS的默认值是新行。

要在文件内部进行更改,请使用awk的-inplace选项,如果它不可用:

awk '{firstSeven=substr($0,1,7);gsub(/,/,RS firstSeven)}1' inputfile >inputfile.tmp && mv inputfile.tmp inputfile

答案 1 :(得分:0)

使用sed

sed -E 's/^(.{7})([^,]+),(.*)$/\1\2\'$'\n''\1\3/' file

输出:

990202-1711-BBVRS390-T01
415715-1611-EDUE818C
415715-1711-EDUE818C
415715-1611-EDUE818C-
415715-1711-EDUE818C-T01

另见:

答案 2 :(得分:0)

使用sed

sed 's/\(.\{7\}\)\([^,]*\),\(.*\)/\1\2\n\1\3/g' filename
正则表达式中的

。意味着每个角色;
\(.\{7\}\) - 我标记前7个字符 \([^,]*\) - 用我标记不包含逗号的第8个字符部分 ,\(.*\) - 这将有逗号,.*我将所有其他字符标记在逗号后到结尾。
\1\2 - 反斜杠和数字我可以使用标记的部分行(首先标记为\1,第二个\2,依此类推。)

答案 3 :(得分:0)

由于之前的sed答案通过解决$使用整行,我的目的是:

sed -E 's/^([0-9]+)-([^,]*),/\1-\2\n\1-/' file

sed 's/^\([0-9]\+\)-\([^,]*\),/\1-\2\n\1-/' file.tst

990202-1711-BBVRS390-T01
415715-1611-EDUE818C
415715-1711-EDUE818C
415715-1611-EDUE818C-
415715-1711-EDUE818C-T01

其中\1是行首的数字,跟随-\2到下一个昏迷,。没有提及\3

要严格回答请求: 前7个字符 ,请使用:

sed -E 's/^(.{7})([^,]*),/\1\2\n\1/'

但是看到输入数据,我认为检查第一个数字可能会更好。

从那里,如果某条线可能包含超过1个昏迷,请使用:

sed -E ':;s/^([0-9]+)-([^,]*),/\1-\2\n\1-/;t'

sed ':;s/^\([0-9]\+\)-\([^,]*\),/\1-\2\n\1-/;t' file

示例:

cat >file.tst <<eof
990202-1711-BBVRS390-T01
415715-1611-EDUE818C,1711-EDUE818C,1812-EDUE818C
415715-1611-EDUE818C-,1711-EDUE818C-T01
eof

sed ':;s/^\([0-9]\+\)-\([^,]*\),/\1-\2\n\1-/;t' <file.tst
990202-1711-BBVRS390-T01
415715-1611-EDUE818C
415715-1711-EDUE818C
415715-1812-EDUE818C
415715-1611-EDUE818C-
415715-1711-EDUE818C-T01

答案 4 :(得分:0)

$ awk -F',' '{pfx=substr($0,1,7); $1=substr($1,8); for (i=1;i<=NF;i++) print pfx $i}' file
990202-1711-BBVRS390-T01
415715-1611-EDUE818C
415715-1711-EDUE818C
415715-1611-EDUE818C-
415715-1711-EDUE818C-T01