我有像
这样的字符串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
答案 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