1

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

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

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

我需要删除最后两个逗号,它们是该行中的第 16 个和第 19 个字符。有人可以告诉我该怎么做吗?我打算使用 colrm,它非常简单,但我似乎无法在 CYGWIN 中安装它。谢谢,麻烦您了!

4

6 回答 6

4

我会用awk这个:

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

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

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

于 2012-04-18T20:12:56.107 回答
2

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

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

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

于 2012-04-18T20:13:18.230 回答
1
echo "2222,H,73.82,04,07,2012" | sed -r 's/(.{15}).(..)./\1\2/'

取 15 个字符,丢弃 1 个,取 2 个,丢弃 1 个。

于 2012-04-18T22:04:26.207 回答
1

我也不掌握如何为 SED 构造正则表达式的概念,所以我希望有人能向我解释一下。

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

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

> 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。更容易理解。:)

于 2012-04-18T20:32:25.350 回答
1

它应该工作:

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

删除第 4 个和下一个逗号

于 2012-04-18T20:22:34.220 回答
0
sed -e 's/(..),(..),(....)$/\1\2\3/' myfile.txt
于 2012-04-18T20:00:08.547 回答