我一直在搜索谷歌,我找不到如何做到这一点的例子。我也不掌握如何为 SED 构造正则表达式的概念,所以我希望有人能向我解释一下。
我正在对一个充满如下文本行的文件运行 bash 脚本:2222,H,73.82,04,07,2012
我需要让它们看起来像这样:2222,H,73.82,04072012
我需要删除最后两个逗号,它们是该行中的第 16 个和第 19 个字符。有人可以告诉我该怎么做吗?我打算使用 colrm,它非常简单,但我似乎无法在 CYGWIN 中安装它。谢谢,麻烦您了!
我会用awk
这个:
awk -F',' -v OFS=',' '{ print $1, $2, $3, $4$5$6 }' inputfile
这需要一个 CSV 文件并打印第一个、第二个和第三个字段,每个字段后跟输出字段分隔符 ( ","
),然后是连接的第四个、第五个和第六个字段。
就我个人而言,我发现这比基于正则表达式的解决方案更易于阅读和维护,sed
并且如果您的任何列变得更宽(或更窄!),它会很好地应对。
这将适用于任何字符串,并且只会删除最后 2 个逗号:
sed -e 's/\(.*\),\([^,]*\),\([^,]*\)$/\1\2\3/' infile.txt
请注意,在我的 sed 变体中,我必须转义括号 YMMV。
echo "2222,H,73.82,04,07,2012" | sed -r 's/(.{15}).(..)./\1\2/'
取 15 个字符,丢弃 1 个,取 2 个,丢弃 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。更容易理解。:)
它应该工作:
sed -e 's~,~~4g' file.txt
删除第 4 个和下一个逗号
sed -e 's/(..),(..),(....)$/\1\2\3/' myfile.txt