Sed 提取字符串之间的文本
如何从充满这些行的文件中提取具有非常特定模式的字符串之间的文本?例:Sed 提取字符串之间的文本,sed,awk,grep,Sed,Awk,Grep,如何从充满这些行的文件中提取具有非常特定模式的字符串之间的文本?例: input:a_log.gz:make=BMW&year=2000&owner=Peter 我想从本质上捕捉零件make=BMW&year=2000。我知道行的开头可以是“input:(任意数量的字符).gz:”结尾可以是“owner=Peter”使用正则表达式:input:.*?\.gz:(.*)&?owner=Peter。捕获将包含第二个冒号和“owner=Peter”之间的内容,并修剪符号。尝试一下:
input:a_log.gz:make=BMW&year=2000&owner=Peter
我想从本质上捕捉零件
make=BMW&year=2000
。我知道行的开头可以是“input:(任意数量的字符).gz:”结尾可以是“owner=Peter”使用正则表达式:input:.*?\.gz:(.*)&?owner=Peter
。捕获将包含第二个冒号和“owner=Peter”之间的内容,并修剪符号。尝试一下:
sed -n 's/.*:\([^&]*&[^&]*\)&.*/\1/p' file
这将提取第二个冒号和第二个与号之间的所有内容,而不管前后是什么(如果冒号或与号较多,则可能无法正常工作)。您可以使用shell(bash/ksh)
如果你愿意的话
$ echo ${s} | sed 's/input.*gz://;s/owner=Peter//'
make=BMW&year=2000&
我没有看到使用
awk
的答案:
awk '{ match($0, /input:.*\.gz:/);
m = RSTART+RLENGTH;
n = index($0, "&owner=Peter") - m;
print substr($0,m,n)
}'
该方法是
sh
版本(通过参数展开的子字符串)和sed
版本(正则表达式)的混合。这是因为awk
RE缺少反向引用。我将在正则表达式中使用什么工具?只要grep?@syker:sed's/input:.*?\.gz:(.*?&?owner=Peter/\1/'就可以了,你需要在parantises上加上反斜杠。@syker:问号是为了使模式不贪婪,但这对sed
不起作用。如果你使用的是nawk或old awk。gawk有反向引用。@ghostdog74我正在使用《awk编程语言》副本中描述的awk
<代码>目瞪口呆
!=awk
(虽然可能是gawk
awk
)。为我使用awk
的一个优点是默认可用性,当您编写gawk
特定代码时,默认可用性将消失。
>echo "input:a_log.gz:make=BMW&year=2000&owner=Peter"|sed -e "s/input:.*.gz://g" -e "s/&owner.*//g"
make=BMW&year=2000
awk '{ match($0, /input:.*\.gz:/);
m = RSTART+RLENGTH;
n = index($0, "&owner=Peter") - m;
print substr($0,m,n)
}'