【问题标题】:Print specific line and if it contains space - replace or print path打印特定行,如果它包含空格 - 替换或打印路径
【发布时间】:2016-12-14 00:46:15
【问题描述】:

就像标题一样 - 我需要查找并通读所有具有特定名称的文件,检查第 7 行是否有特定模式,如果找到 - 打印路径或替换该行。
我对 awk 的管道或 exec 输出有疑问。
find . -name "meta" -exec awk 'NR==7 && /T/' {} \;

如何管道输出这个命令,或者使用 -exec ?

【问题讨论】:

  • print path or replace the line?你想实现哪个动作?搜索的模式是什么?
  • 模式 - `/T/' - 行内包含 T。我想打印打印此行的文件的路径或替换文件中的这一行。
  • 可能是01 Jan 1970,替换什么模式并不重要。

标签: bash awk find


【解决方案1】:

更改 Awk 脚本以打印文件名。

find ... -exec awk 'NR==7 && /T/ { print FILENAME }' {} \;

或者使用退出代码将结果发送回find

find ... -exec awk 'NR==7 { exit($0~/T/) }' () \; -o -ls

如果文件太短,您需要注意使用相同的退出代码;这就是为什么我在找到匹配项的情况下使用稍微违反直觉的非零(失败)退出代码。

如果您想用匹配替换该行,sed -i 可能更容易且更便携,尽管 GNU Awk 也有一个 --inline 选项。

find ... -exec sed -i '7s/.*T.*/foobar/' {} \;

请注意,您在 *BSD 平台(包括 OSX)上需要 sed -i '' '7s...(即,-i 选项需要强制选项参数;传递一个空字符串以不备份文件)。

【讨论】:

    猜你喜欢
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2011-05-28
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多