Regex新秀,希望能改变这一点。我有以下看似非常简单的问题,我无法计算出正确的正则表达式实现来正确地进行解析。基本上,我有一个文件,它的代码行如下所示:
time:3:35PM我只是试着去掉所有的字符,只包括第一个':‘分隔符,并用sed保持其余的字符不变,这样我就可以处理许多相同格式的文件。我想要得到的是:
3:35PM下面是我得到的最接近的分隔符,但只使用最后一个分隔符,而不是第一个分隔符:
sed 's/.*://'我也尝试过使用python,但在应用python函数来迭代许多文件中的所有行时遇到了挑战,而不是只遍历一个文件。
任何帮助都将不胜感激。
发布于 2013-09-15 05:49:53
您可以在几乎所有的文本处理工具中做到这一点(许多工具根本不使用正则表达式)。
边缘
如果就地编辑真的很重要,那么规范的正确方法不是sed (流编辑器),而是ed (文件编辑器)。
ed "$file" << EOF
,s/^[^:]*://g
w
EOFsed
(命令与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"发布于 2013-09-15 05:35:36
由于不需要正则表达式来匹配单个已知字符,因此请考虑使用cut而不是sed。
这个简单的表达式将:设置为d-elimiter,并发出f-ields 2,expression (-):
cut -d: -f2-示例:
% echo 'time:3:35PM' | cut -d: -f2-
3:35PM发布于 2013-09-15 07:49:06
kojiro's answer有很多很好的替代方案,但是您已经问过如何使用regex来做到这一点。以下是一些纯粹的正则表达式解决方案:
grep -oP '[^:]*:\K.*' file.txt在\K出现之前,\K让它忘记了一切。但是如果你知道确切的前缀长度,那么你可以使用lookaround特性:
grep -oP '(?<=^time:).*' file.txt请注意,大多数regex实现都不支持这些特性。您可以在带有-P标志和perl本身的grep中使用它。我想知道是否有其他实用程序支持这些。
https://stackoverflow.com/questions/18806186
复制相似问题