Regex 使用sed将前两个空格替换为逗号
我有一个以空格分隔的文件,每行上有可变数量的条目。我想用逗号替换前两个空格,以创建一个有三列的逗号分隔文件 以下是我的意见:Regex 使用sed将前两个空格替换为逗号,regex,perl,parsing,command-line,sed,Regex,Perl,Parsing,Command Line,Sed,我有一个以空格分隔的文件,每行上有可变数量的条目。我想用逗号替换前两个空格,以创建一个有三列的逗号分隔文件 以下是我的意见: a b 1 2 3 3 2 1 c d 44 55 66 2355 line http://google.com 100 200 300 ef jh 77 88 99 z y 2 3 33 这是我想要的输出: a,b,1 2 3 3 2 1 c,d,44 55 66 2355 line,http://google.com,100 200 300 ef,jh,77
a b 1 2 3 3 2 1
c d 44 55 66 2355
line http://google.com 100 200 300
ef jh 77 88 99
z y 2 3 33
这是我想要的输出:
a,b,1 2 3 3 2 1
c,d,44 55 66 2355
line,http://google.com,100 200 300
ef,jh,77 88 99
z,y,2 3 33
我试图在sed命令中使用perl正则表达式,但我不能完全让它工作。首先,我尝试捕获一个单词,后跟一个空格,然后是另一个单词,但这仅适用于第1、2和5行:
$ cat test | sed -r 's/(\w)\s+(\w)\s+/\1,\2,/'
a,b,1 2 3 3 2 1
c,d,44 55 66 2355
line http://google.com 100 200 300
ef jh 77 88 99
z,y,2 3 33
我还尝试捕获空白、一个单词,然后捕获更多的空白,但这给了我相同的结果:
$ cat test | sed -r 's/\s+(\w)\s+/,\1,/'
a,b,1 2 3 3 2 1
c,d,44 55 66 2355
line http://google.com 100 200 300
ef jh 77 88 99
z,y,2 3 33
我也试着用。?通配符,但这对第4行来说很有趣
$ cat test | sed -r 's/\s+(.?)\s+/,\1,/'
a,b,1 2 3 3 2 1
c,d,44 55 66 2355
line http://google.com 100 200 300
ef jh,,77 88 99
z,y,2 3 33
非常感谢您的帮助 这个怎么样:
sed -e 's/\s\+/,/' | sed -e 's/\s\+/,/'
使用单个sed命令可能是可行的,但这确实是一种简单的方法:)
我的输出:
a,b,1 2 3 3 2 1
c,d,44 55 66 2355
line,http://google.com,100 200 300
ef,jh,77 88 99
z,y,2 3 33
试试这个:
sed -r 's/\s+(\S+)\s+/,\1,/'
在一次尝试中将
\w
(一个“单词”字符)替换为\S+
(一个或多个非空格字符)。SedS///
支持一种方式来说明要替换的模式的哪一个出现:只需将n
添加到命令末尾,以仅替换第次出现的n
。因此,要替换第一次和第二次出现的空白,只需按以下方式使用:
$ sed 's/ */,/1;s/ */,/2' input
a,b ,1 2 3 3 2 1
c,d ,44 55 66 2355
line,http://google.com 100,200 300
ef,jh ,77 88 99
z,y 2,3 33
编辑:阅读另一个建议的解决方案,我注意到s/*/,/
之后的1
和2
不仅没有必要,而且显然是错误的。默认情况下,s//
只替换第一次出现的模式。因此,如果我们有两个相同的s//
序列,它们将替换第一个和第二个匹配项。你需要的只是
$ sed 's/ */,/;s/ */,/' input
(请注意,如果用分号分隔两个sed命令,则可以将它们放在一个表达式中。某些sed实现不接受
s//
命令后的分号;在这种情况下,使用换行符分隔命令。)只需提供多个-e
参数,就可以为sed
的单个实例提供多个命令
要执行前两项操作,只需使用:
sed -e 's/\s\+/,/' -e 's/\s\+/,/'
这基本上是按顺序在行上运行两个命令,第一个执行第一个空格块,第二个执行下一个空格块
下面的文字记录显示了这一点:
pax$ echo 'a b 1 2 3 3 2 1
c d 44 55 66 2355
line http://google.com 100 200 300
ef jh 77 88 99
z y 2 3 33
' | sed -e 's/\s\+/,/' -e 's/\s\+/,/'
a,b,1 2 3 3 2 1
c,d,44 55 66 2355
line,http://google.com,100 200 300
ef,jh,77 88 99
z,y,2 3 33
不确定sed/perl,但这里有一个(丑陋的)awk解决方案。它只打印字段1-2(用逗号分隔),然后打印其余字段(用空格分隔):
awk '{
printf("%s,", $1)
printf("%s,", $2)
for (i=3; i<=NF; i++)
printf("%s ", $i)
printf("\n")
}' myfile.txt
awk'{
printf(“%s,”,$1)
printf(“%s”,$2)
对于(i=3;i而言,Perl解决方案是:
perl -pe '$_=join ",", split /\s+/, $_, 3' some.file
谢谢,工作起来很有魅力。我肯定把这个问题弄得太复杂了!另一个Perl解决方案不会有什么坏处,因为这个问题是用Perl和Sed标记的。Perl-pe的/([^\s,]+)\s/$1。(我的$c++至少在使用Perl时使用自动拆分。-)例如:Perl-anE'说“$F[0],$F[1],$F[2]$F[3..\F]”“
我想应该是perl-anE”说“$F[0],$F[1],$F[2]@F[3..$#F]”