【发布时间】:2015-08-27 19:22:12
【问题描述】:
我与许多在 OSX 上使用可怕的 XCode 的开发人员一起工作!更重要的是,他们需要在其构建代理上拥有多个版本,并在它们之间切换以构建与所述版本紧密耦合的旧代码! (我知道,这不是我的选择!)无论如何,为了让这种情况保持清醒,我在他们的构建上做了一个小报告,显示了
(a) /Applications 下的 XCode 是什么,使用命令:
$ find /Applications -name Xcode\* -maxdepth 1 -type d
给出如下输出:
/Applications/Xcode.app
/Applications/Xcode6.1.1.app
...和... (b) 'xcode-select' 工具已将其系统设置为使用哪个 Xcode,使用以下命令:
$ xcode-select -p | sed 's#/Contents/Developer##g'
( xcode-select 给出的输出,例如/Applications/Xcode.app/Contents/Developer 或/Applications/Xcode6.1.1.app/Contents/Developer 取决于哪个正在使用)
无论如何,我希望做的是整理这份报告。我希望不是首先输出系统上的一组文件夹,然后是设置要使用的文件夹,而是我可以在附加箭头时只输出由 find 生成的列表,或者<-- , <--Selected-Version-- 或类似的东西,到包含文本字符串的任何行的末尾/匹配给定的给定正则表达式。
尽管解决这个问题会很好,因为我总是尝试制作可以重复使用的通用代码,但我希望制作一个可以在类似上下文中重复使用的函数,如果这不会使整个想法不可行的话。
我的尝试如下:
appendArrowToMatchingLines ()
{
local SEARCHstr
local TEXT_BUFFERstr
# Have we got more than one argument, but not exactly two
if [ "$#" -gt "1" ] && [ "$#" -ne "2" ]
then
printf -v SEARCHstr "%q" "${1}"
shift
printf -v TEXT_BUFFERstr "%q" "$@"
shift $#
# Have we got exactly two arguments?
elif [ "$#" -eq "2" ]
then
printf -v SEARCHstr "%q" "${1}"
shift
printf -v TEXT_BUFFERstr "%q" "${1}"
shift
# Third form, we must be streaming from STD_IN
else
printf -v SEARCHstr "%q" "${1}"
printf -v TEXT_BUFFERstr "%q" "$( cat - )"
fi
printf "%s" "${TEXT_BUFFERstr}" | sed "/${SEARCHstr}/ s/$/<--/"
}
但是,不幸的是,这不起作用:(任何有关构建“将箭头附加到匹配行”功能的帮助将不胜感激!
另一个角度,如果我可以在没有缓冲的情况下做到这一点,那就更理想了,我见过类似的东西:
$ find . -name test.txt -exec sed -i '/PATTERN/ s/)$/); /' '{}' \;
在论坛中,他们建议他们可以在一个流中做类似的事情,尽管我也无法让它工作,而且我真的不知道从哪里开始! :)
再次感谢了解 sed/awk 世界的人的任何帮助!
【问题讨论】:
-
没有 sed/awk。有 sed,也有 awk。 2 个完全独立的工具,具有自己的语法、用途等。当你想在一行上替换一些文本时,你可以使用 sed。当你想做更多的事情时,你可以使用 awk。你永远不会做的是编写一个 shell 脚本来完成一些工作并调用 sed 来完成其他工作。如果您只是发布一些清晰的示例输入和预期的输出,我们可以向您展示如何编写简洁的 awk 脚本来执行您想做的任何事情。