【问题标题】:Negative lookahead not working with SourceFile负前瞻不适用于 SourceFile
【发布时间】:2017-02-23 04:36:54
【问题描述】:

我正在尝试使用正则表达式编辑一些文件。

sed 似乎太有限,所以我改用 Perl。

我的语法可能有问题。

正则表达式模式适用于 TextMate。

当我使用 Perl 时没有任何反应。

我想删除所有不包含SourceFile"" 的行。

供您参考,用于清理来自exiftools 的输出数据。

$ perl -pe 's/^(?!.*(SourceFile|"").*).*$\n//g' out.csv

$ cat out.csv
SourceFile,GPSLatitude,GPSLongitude
1.jpg,,
2.jpg,,
3.jpg,"10 deg 20' 30.30"" N","40 deg 50' 60.60"" W"
4.jpg,"10 deg 20' 30.30"" N","40 deg 50' 60.60"" W"

清理应保留第一行和所有包含 GPS 数据的行。所以清理后应该是这样的:

SourceFile,GPSLatitude,GPSLongitude
3.jpg,"10 deg 20' 30.30"" N","40 deg 50' 60.60"" W"
4.jpg,"10 deg 20' 30.30"" N","40 deg 50' 60.60"" W"

【问题讨论】:

  • 你想用这个正则表达式做什么?包括您的输入和输出样本。
  • 如果您可以再次重新运行您的 exiftool 命令,一个选项是告诉 exiftool 仅处理包含 gps 坐标的文件,例如exiftool -if '$GPSLatitude and $GPSLongitude' -GPSLatitude -GPSLongitude -csv >out.csv TargetDir
  • 感谢@StarGeek!最有用的帮助。

标签: regex bash macos perl exiftool


【解决方案1】:

如果要删除一行,则无需进行替换。检查条件并显示该行:

[edit] 似乎您想要的与您的初始模式所暗示的相反:

perl:

perl -ne '/SourceFile|""/&&print' file

awk:

awk '/SourceFile|""/' file

grep:

grep 'SourceFile\|""' file

[旧答案]

perl -ne '!/SourceFile|""/&&print' file

awk 更短:

awk '!/SourceFile|""/' file

或grep:

grep -v 'SourceFile\|""' file

【讨论】:

  • @Kasam:我看不出它不起作用的原因,你可能错过了一些东西。
  • 谢谢!现在我正在尝试添加更多模式。将“deg”替换为“°”,将“'”替换为“′”。并且还截断一些文件名。啊,如果正则表达式方法有效,那就很容易了。
  • @Kasam:既然是csv文件,你也可以检查第二个字段是否为空。
  • 好提示。我不知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 2020-07-03
相关资源
最近更新 更多