【发布时间】:2012-03-12 21:34:09
【问题描述】:
如何使用位于两个字符串之间的 grep 命令 txt 获取文本?
例如:
<--string 1-->
the text i need
<--string 2-->
两个标签之间的“我需要的文本”是动态的,因此我需要一个命令将文本从“”输出到“”
【问题讨论】:
-
“我需要的文字”是一行还是更多?
如何使用位于两个字符串之间的 grep 命令 txt 获取文本?
例如:
<--string 1-->
the text i need
<--string 2-->
两个标签之间的“我需要的文本”是动态的,因此我需要一个命令将文本从“”输出到“”
【问题讨论】:
这可能对你有用:
grep -A2 "<--string 1-->" file | grep -v "<--string 1-->\|<--string 2-->"
或
grep -A1 "<--string 1-->" file | grep -v "<--string 1-->"
或在单个进程中:
sed '/<--string 1-->/,/<--string 2-->/!d;//d' file
或:
awk '/<--string 2-->/{p=0};p;/<--string 1-->/{p=1}' file
【讨论】:
假设“我需要的文本”只有一行,您应该检查 string1 和 string2 是否都出现(Alex 的解决方案只检查一件事)。
更好的解决方案是:
grep -A 2 "string 1" $file | tail -2 | grep -B 1 "string 2" | head -1
【讨论】:
如果您知道“我需要的文本”总是高于或低于字符串 1 或字符串 2,您可以使用 grep -A 1 "string 1" $file | tail -1 或 grep -B 1 "string 2" $file | head -1
【讨论】:
我们需要知道 string1 和 string2 的行号是多少 我们可以使用 grep -n 然后使用 head 和 tail 我们可以得到 string1 和 string2 之间的线 例如:
<--string 1-->
the text i need
<--string 2-->
start=$(cat file | grep -n <--string 1--> | grep -Eo [0-9]+)
finish=$cat file | grep -n <--string 2-->) | grep -Eo [0-9]+)
res=$((finish-start))
result=$(cat file | head -$start | tail -$res)
这有点hacky,但它对我有用。
【讨论】:
希望对你有帮助。
DATA=$(cat /tmp/file)
STARTVAR=$(echo "$DATA" | grep -n '<--string 1-->' | grep -Eo [0-9]+)
ENDVAR=$(echo "$DATA" | grep -n '<--string 2-->' | grep -Eo [0-9]+)
CALC=$((($ENDVAR - $STARTVAR) - 1))
result=$(echo "$DATA" | grep -A $CALC '<--string 1-->')
echo "$result"
如果您想在输出中包含'<--string 2-->',请将CALC=$((($ENDVAR - $STARTVAR) - 1)) 行替换为CALC=$(($ENDVAR - $STARTVAR))
【讨论】:
您可以为此使用 awk。
包容性:
awk '/<--string 1-->/,/<--string 2-->/' file
不包括字符串1和2行:
awk '/<--string 1-->/{flag=1; next} /<--string 2-->/{flag=0} flag' file
这里,当在该行中找到''时设置一个标志,并在找到''时取消设置。
您也可以使用以下方式保留第一行或第二行:
awk '/<--string 1-->/{flag=1} /<--string 2-->/{flag=0} flag' file
或
awk 'flag; /<--string 1-->/{flag=1} /<--string 2-->/{flag=0}' file
【讨论】:
grep word filename
在 wiki 上检查 grep..http://en.wikipedia.org/wiki/Grep
【讨论】: