使用Sed / Regex基于分隔符拆分bash中的一行

时间:2013-09-14 20:37:22

标签: regex bash sed

正则表达新秀并希望改变这一点。我有以下看似非常简单的问题,我无法正确解析正确的正则表达式实现。基本上我有一个文件,其行如下所示:

time:3:35PM

我只是试图删除所有字符,包括ONLY FIRST':'分隔符,并使用sed保持其余字符完整,以便我可以处理许多具有相同格式的文件。我想要得到的是:

3:35PM

下面是我得到的最接近但是只使用最后一个分隔符而不是第一个分隔符。:

sed 's/.*://'

我也尝试过使用python,但是在应用python函数迭代许多文件中的所有行而不是只有一个文件时遇到了挑战。

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:4)

您可以在几乎所有文本处理工具中完成此操作(许多文档处理工具完全不使用正则表达式)。

如果就地编辑非常重要,那么规范的正确方法不是sed( stream 编辑器),而是ed文件编辑器)

ed "$file" << EOF
,s/^[^:]*://g
w
EOF

SED

(与ed相同的命令,格式稍有不同)

sed 's/^[^:]*://' < "$file" > "$file".new
mv "$file".new "$file"

BASH

这个不会导致产生任何新进程。 (无论什么价值。)

while IFS=: read _ time; do
    printf '%s\n' "$time"
done < "$file" > "$file".new
mv "$file".new "$file"

AWK

awk -F: 'BEGIN{ OFS=":" } { print $2,$3 }' < "$file" > "$file".new
mv "$file".new "$file"

cut -d: -f2- < "$file" > "$file".new
mv "$file".new "$file"

答案 1 :(得分:3)

由于您不需要正则表达式来匹配单个已知字符,因此请考虑使用而不是

此简单表达式将:设置为d - elimiter并发出f - ield 2,向前(-):

cut -d: -f2-

示例:

% echo 'time:3:35PM' | cut -d: -f2-
3:35PM

答案 2 :(得分:1)

删除最多:的所有实例,并包括您可以执行的: ..

sed -i.bak 's/^[^:]*://' file.txt

多个.txt个文件

sed -i.bak 's/^[^:]*://' *.txt

-i选项指定要就地编辑文件。通过创建临时文件并将输出发送到此文件而不是标准输出。

答案 3 :(得分:1)

kojiro's answer有很多很好的选择,但是你已经问过regex如何做到这一点。以下是一些纯正的正则表达式解决方案:

grep -oP '[^:]*:\K.*' file.txt

\K会在\K出现之前忘记所有内容。 但如果您知道确切的前缀长度,则可以使用lookaround功能:

grep -oP '(?<=^time:).*' file.txt

请注意,大多数正则表达式实现都不支持这些功能。您可以在grep中使用-P标记和perl本身。我想知道是否有其他实用程序支持这些。

答案 4 :(得分:0)

请在这里考虑我的答案:

How to use regex with cut at the command line?

例如,您可以只写:

echo 'time:3:35PM' | cutr -d : -f 2- -r :

在您的情况下,您可以简单地使用cut

echo 'time:3:35PM' | cut -d : -f 2-

欢迎任何反馈。 cutr尚不完善,但是在我投入太多时间之前,我想获得一些反馈。