将文本字符串附加到包含bourne和bash

时间:2015-06-11 21:40:26

标签: regex xcode bash awk sed

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

(a)XCodes在/ Applications下使用命令:

$ find /Applications -name Xcode\* -maxdepth 1 -type d

提供输出,例如:

/Applications/Xcode.app
/Applications/Xcode6.1.1.app

......而且...... (b)哪个Xcode' xcode-select'工具已使用以下命令设置要使用的系统:

$ xcode-select -p | sed 's#/Contents/Developer##g'

(xcode-select根据正在使用的内容提供/Applications/Xcode.app/Contents/Developer/Applications/Xcode6.1.1.app/Contents/Developer等输出

无论如何,我希望做的是将这份报告整理一下。我希望不是首先输出系统上的文件夹集,而是设置要使用的那个文件夹,而不是我只能输出由find生成的列表,同时附加箭头{{1 }},<--或类似的东西,到包含文本字符串的任何行的末尾/匹配给定的给定正则表达式。

虽然只是解决这个问题会很好,因为我总是尝试制作我可以重复使用的通用代码,但是我希望能够创建一个我可以在类似环境中重用的函数,如果它不能创造整个想法的话不可行的。

我对此的尝试如下:

<--Selected-Version--

但是,不幸的是,这不起作用:(任何有关构建&#34的帮助;在匹配线附加箭头&#34;功能将非常感谢!

另一个角度,如果我能在没有缓冲的情况下做到这一点会更加理想,我看到的是:

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/$/<--/"
}

在论坛中,他们建议他们可以在一个流中做同样的事情,虽然我也无法让它工作,但我真的不知道从哪里开始! :)

再一次,任何了解sed / awk世界的人的帮助都会非常感激!!

2 个答案:

答案 0 :(得分:0)

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

# 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 -- '%s\n' "$search" | sed 's/[[\.*^$(){}?+|/]/\\&/g')   
    # escape special symbols '&', '/' and '\' in sed RHS (replacement)
    suffix=$(printf -- '%s\n' "$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:如果我们有匹配则打印该行

答案 1 :(得分:0)

将文字附加到匹配的行只是:

$ 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