如何在shell awk或sed的特殊字符串之间获取内容?

时间:2014-07-09 01:17:43

标签: bash shell awk sed

我的文件包含以下内容:

(visible:true)
url(http://style.ep.com/image/control/flash1-tab.gif)
<img src="http://img1.ep.com/4667/product/s-50f8f86cf0822.jpg.jpg" alt="god">
<script src="http://img1.ep.com/4667/codeFromLink.js"></script>

我想获取url(和)之间的内容,同时src =“和”,结果如下:

http://style.ep.com/image/control/flash1-tab.gif
http://img1.ep.com/4667/product/s-50f8f86cf0822.jpg.jpg
http://img1.ep.com/4667/codeFromLink.js

我用过以下:

awk 'BEGIN{RS=")";FS="("}NF>1{print $NF}' $file_obj
awk 'BEGIN{RS=" ";FS="src=\""}NF>1{print($NF)}' $file_obj |sed 's/\"//g'

但我得到了:

visible:true
http://style.ep.com/image/control/flash1-tab.gif
http://img1.ep.com/4667/product/s-50f8f86cf0822.jpg.jpg
http://img1.ep.com/4667/codeFromLink.js></script>

怎么样? 非常感谢。

5 个答案:

答案 0 :(得分:1)

非常短的grep解决方案:

grep -Po '(url\(|src=")\K[^")]*' "$file_obj"

您可以阅读\K here

或者更长一点,但更安全:

grep -Po 'url\(\K[^)]*|src="\K[^"]*' "$file_obj"

答案 1 :(得分:0)

使用grep参数

尝试-oP
$ grep -oP '(?<=url\()[^)]*|(?<=src=\")[^"]*' file
http://style.ep.com/image/control/flash1-tab.gif
http://img1.ep.com/4667/product/s-50f8f86cf0822.jpg.jpg
http://img1.ep.com/4667/codeFromLink.js

通过awk,

$ awk -F\( '/^url/{sub(/.$/,"",$2); print $2}/src=/{split($0,a,"\""); print a[2]}' file
http://style.ep.com/image/control/flash1-tab.gif
http://img1.ep.com/4667/product/s-50f8f86cf0822.jpg.jpg
http://img1.ep.com/4667/codeFromLink.js

答案 2 :(得分:0)

$ sed -r -n -e 's/url\(([^)]+).*/\1/p' file
http://style.ep.com/image/control/flash1-tab.gif

$ sed -r -n -e 's/.*src="([^"]+).*/\1/p' file
http://img1.ep.com/4667/product/s-50f8f86cf0822.jpg.jpg
http://img1.ep.com/4667/codeFromLink.js

$ sed -r -n -e 's/url\(([^)]+).*/\1/p' -e 's/.*src="([^"]+).*/\1/p' file
http://style.ep.com/image/control/flash1-tab.gif
http://img1.ep.com/4667/product/s-50f8f86cf0822.jpg.jpg
http://img1.ep.com/4667/codeFromLink.js

答案 3 :(得分:0)

简化的awk解决方案:

awk -F'url\\(|\\)|src="|"' 'length($2) {print $2}' file
  • -F'url\\(|\\)|src="|"'定义正则表达式,用作字段分隔符(存储在保留变量FS中,-F命令-line选项集),有效地包含以下标记:
    • url(
    • )
    • src="
    • "
    • 请注意()所需的双反斜杠转义
      • awk&#39> 一般字符串解析在第一遍中解释\转义序列,因此\\告诉它文字{{ 1}}应该成为生成的正则表达式的一部分,以便正则表达式引擎看到,例如\,即:\(字符应该字面(而不是启动捕获组。)。
  • 拆分每一行使用这些标记,因为字段分隔符会将网址放入第二个字段(
  • 由于并非所有输入行都包含URL,因此模式$2(隐含:length($2))可确保仅对找到URL的行执行打印命令length($2) > 0

警告:不会使用嵌入了{print $2}个字符的网址,但这在实践中很少见。
要解决此问题,请改用以下内容:

)

答案 4 :(得分:0)

这是另一个gnu awk(由于RS包含多个字符而产生的gnu)

awk -v RS="http" -F'[")]' 'NR>1{print RS$1}' file
http://style.ep.com/image/control/flash1-tab.gif
http://img1.ep.com/4667/product/s-50f8f86cf0822.jpg.jpg
http://img1.ep.com/4667/codeFromLink.js