将文本字符串追加到包含 bourne 和 bash 中另一个文本字符串的行



我与大量在OSX上使用可怕的XCode的开发人员一起工作! 更重要的是,他们需要在构建代理上有许多版本,并在它们之间切换以构建与所述版本紧密耦合的旧代码!(我知道,不是我的选择! 无论如何,为了尝试对这种情况保持一些理智,在他们的构建中,我做了一个小报告,显示

(a) XCodes 在/Applications 下是什么,使用以下命令:

$ 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 世界的人的帮助将不胜感激!!

以下函数会将作为第二个参数提供的字符串附加到与第一个参数匹配的行中:

# Append $2 to lines matching $1
function str_append() {
    [ $# -lt 2 ] && return 2
    local search=$1; local suffix=$2
    # Safely escape the $search variable for use in sed LHS (search pattern)
    search=$(printf -- '%sn' "$search" | sed 's/[[.*^$(){}?+|/]/\&/g')   
    # escape special symbols '&', '/' and '' in sed RHS (replacement)
    suffix=$(printf -- '%sn' "$suffix" | sed 's/[&/]/\&/g')
    # Append $suffix to lines matching $search
    sed "/$search+/s/$/${suffix}/"
}

当然,为了使此功能可用于命令行使用,您必须将其放置在环境中加载的文件中,例如在 ~/.bashrc 或 ~/.bash_profile 文件中。然后:

要向与"file_pattern"匹配的所有行添加箭头,请运行:

find . -name '*.txt' | str_append "file_pattern" " <--"

要向 find run 输出的所有行添加箭头,请执行以下操作:

find . -name '*.txt' | str_append "." " <--"

上面的函数将输出所有行,包括与搜索字符串匹配的行和不匹配的行。为了仅输出匹配的行并在其上附加一个箭头,请运行:

find . -name '*.txt' | grep 'file_pattern' | str_append '.' ' <--'

或者,如果您希望将此行为作为默认值,请将sed行更改为:

sed -n "/$search+/s/$/${suffix}/p"

-n:默认情况下
不打印输入行 /p:如果我们有匹配,请打印行

将文本附加到匹配行只需:

$ cat file
a
b
c
$ awk '/b/{$0 = $0 " <--- here is b"} 1' file
a
b <--- here is b
c

如果您需要其他内容,请编辑您的问题以显示清晰、精确、可测试的示例输入和预期输出。

在下面发表您的评论:

$ awk -v var=" <--- here is b" '/b/{$0 = $0 var} 1' file
a
b <--- here is b
c
$ var=" <--- here is b"
$ awk -v var="$var" '/b/{$0 = $0 var} 1' file
a
b <--- here is b
c

最新更新