例如:
((
extract everything here, ignore the rest
))
我知道如何忽略其中的一切,但我不知道如何做相反的事情。基本上,它将是一个文件,它需要在两个点之间提取数据,然后将其输出到另一个文件。我已经尝试了无数的方法,而且似乎都告诉我文件中不存在的缩进,当它出现时。
如果有人能指出我正确的方向,我将不胜感激。
答案 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
需要跳线才能使范围选择独占。