Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用sed将前两个空格替换为逗号_Regex_Perl_Parsing_Command Line_Sed - Fatal编程技术网

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+
(一个或多个非空格字符)。

Sed
S///
支持一种方式来说明要替换的模式的哪一个出现:只需将
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]”