使用Shell从字符串中间删除第n个字符

时间:2012-04-18 19:57:07

标签: bash sed

我一直在搜索谷歌,我找不到如何做到这一点的例子。我也没有掌握如何为SED构建正则表达式的概念,所以我希望有人可以向我解释这个。

我正在针对一个文本行的文件运行一个bash脚本,如下所示:2222,H,73.82,04,07,2012

我需要让它们看起来像这样:2222,H,73.82,04072012

我需要删除最后两个逗号,即行中的第16个和第19个字符。 有人能告诉我该怎么做吗?我打算使用colrm,这很简单,但我似乎无法安装在CYGWIN中。拜托,谢谢!

6 个答案:

答案 0 :(得分:4)

我会使用awk

awk -F',' -v OFS=',' '{ print $1, $2, $3, $4$5$6 }' inputfile

这将获取一个CSV文件并打印第一个,第二个和第三个字段,每个字段后跟输出字段分隔符(","),然后连接第四个,第五个和第六个字段。

就个人而言,我发现这比 sed 中基于正则表达式的解决方案更容易阅读和维护,如果您的任何列变得更宽(或更窄!),它将很好地应对。 / p>

答案 1 :(得分:2)

这将适用于任何字符串,并且只会删除最后2个逗号:

sed -e 's/\(.*\),\([^,]*\),\([^,]*\)$/\1\2\3/' infile.txt

请注意,在我的sed变体中,我必须转义括号YMMV。

答案 2 :(得分:1)

应该有效:

sed -e 's~,~~4g' file.txt

删除第4个和下一个逗号

答案 3 :(得分:1)

  

我也没有掌握如何构建常规的概念   SED的表达,所以我希望有人可以向我解释这一点。

人们在这里告诉你的基本符号是:s/PATTERN/REPLACEMENT/

您的PATTERN是一个正则表达式,可能包含括号中的部分。然后可以在命令的REPLACEMENT部分中引用这些部分。例如:

> echo "aabbcc" | sed 's/\(..\)\(..\)\(..\)/\2\3\1/'
bbccaa

请注意,在sed版本中我使用默认为“基本”RE方言,其中表达式中的括号需要转义。你可以用“扩展”方言做同样的事情:

> echo "aabbcc" | sed -E 's/(..)(..)(..)/\2\3\1/'
bbccaa

(在GNU sed中(您在Linux中找到),您可以使用-r选项而不是-E获得相同的结果。我正在使用OS X.)

我应该说,对于你的任务,我肯定会遵循Johnsyweb的建议并使用awk而不是sed。更容易理解。 :)

答案 4 :(得分:1)

echo "2222,H,73.82,04,07,2012" | sed -r 's/(.{15}).(..)./\1\2/'

取15个字符,丢一个,取2个,丢一个。

答案 5 :(得分:0)

sed -e 's/(..),(..),(....)$/\1\2\3/' myfile.txt