Bash - 在两点之间提取字符串

时间:2013-04-20 20:43:50

标签: bash

例如:

((

extract everything here, ignore the rest

))

我知道如何忽略其中的一切,但我不知道如何做相反的事情。基本上,它将是一个文件,它需要在两个点之间提取数据,然后将其输出到另一个文件。我已经尝试了无数的方法,而且似乎都告诉我文件中不存在的缩进,当它出现时。

如果有人能指出我正确的方向,我将不胜感激。

4 个答案:

答案 0 :(得分:2)

如果您的数据是“面向行”,那么标记就是单独的(如示例中所示),您可以尝试以下某些操作:

function getdata() {
    cat - <<EOF
before
((
    extract everything here, ignore the rest
    someother text
))
after
EOF
}

echo "sed - with two seds"
getdata | sed -n '/((/,/))/p' | sed '1d;$d'

echo "Another sed solution"
getdata | sed -n '1,/((/d; /))/,$d;p'

echo "With GNU sed"
getdata | gsed -n '/((/{:a;n;/))/b;p;ba}'

echo "With perl"
getdata | perl -0777 -pe "s/.*\(\(\s*\\n(.*)?\)\).*/\$1/s"

Ps:是的,它看起来像疯狂牙签的舞蹈

答案 1 :(得分:1)

假设你想在((和))中提取字符串:

VAR="abc((def))ghi"
echo "$VAR"
VAR=${VAR##*((}
VAR=${VAR%%))*}
echo "$VAR"

##从一开始就切断了最长的字符串; #从一开始就切断了最短的字符串; %%在最后切掉最长的弦; %在最后删除了短信字符串

答案 2 :(得分:0)

文件:

$ cat /tmp/l
((
    extract everything here, ignore the rest
    someother text
))

脚本

$ awk '$1=="((" {p=1;next} $1=="))" {p=o;next} p' /tmp/l
    extract everything here, ignore the rest
    someother text

答案 3 :(得分:0)

sed -n '/^((/,/^))/ { /^((/b; /^))/b; p }'

简要说明:

/^((/,/^))/: range addressing (inclusive)
{ /^((/b; /^))/b; p }: sequence of 3 commands
                       1. skip line with ^((
                       2. skip line with ^))
                       3. print

需要跳线才能使范围选择独占。