我有以下字串
xml_srx_name="<name>SRX-NAME</name>"
我正在嘗試列印 > 和 < 之間的文本,因此它將列印SRX-NAME
我真的很接近,但這就是我得到的:>SRX-NAME<這是我用這個命令能夠實作的:
$ cat $xml_srx_name | awk '/SRX-NAME/ {print $1}' | grep -oPz "(?s)>.*?<" | tr '\0' '\n'
Output:
>SRX-NAME<
uj5u.com熱心網友回復:
如果您最終得到一個使用cat,的復合命令awk,那么您可能有一個很好的反模式示例。一個人就夠了:greptrawk
$ xml_srx_name="<name>SRX-NAME</name>"
$ awk -F'<|>' '/SRX-NAME/ {print $3}' <<< "$xml_srx_name"
SRX-NAME
或與sed:
$ sed '/SRX-NAME/s/.*>\(.*\)<.*/\1/' <<< "$xml_srx_name"
SRX-NAME
uj5u.com熱心網友回復:
input="test<hello>text"
rightpart=${input#*<} # remove prefix up to "<" (included)
output=${rightpart%>*} # remove suffix from ">" (included)
echo $output
或者
在 bash 中使用 extglob,您可以一步完成:
shopt -s extglob
input='test<hello>heythere'
echo "${input//@(*<|>*)/}"
這里 @( <|> ) 匹配從 start 到 < 字符的子字串或從 > 到 end 的子字串。使用 // 我們將所有此類實體替換為空字串。
uj5u.com熱心網友回復:
你可以試試
| tr -d '<>'最后添加- 采用
cat … |grep -o SRX-NAME - 采用
cat … |cut -d \> -f 2 | cut -d \< -f 1
uj5u.com熱心網友回復:
您可以使用grep具有零長度斷言的 GNU,如下所示讓file.txt內容為
xml_srx_name="<name>SRX-NAME</name>"
然后
grep -Po "(?<=\>).*(?=\<)" file.txt
輸出
SRX-NAME
>解釋:在 之后和之前找到 0 個或多個字符<。
(在 GNU grep 3.4 中測驗)
uj5u.com熱心網友回復:
您也可以只grep -oP使用與 perl 兼容的正則運算式:
<(name>)\K[^<] (?=</\1)
或者寫出完整的模式:
<name>\K[^<] (?=</name>)
解釋
<從字面上匹配(name>)\Kname>在第 1 組中捕獲[^<]匹配 1 個字符以外的字符<(?=</\1)正向前瞻,向右斷言
例子
xml_srx_name="<name>SRX-NAME</name>"
grep -oP "<(name>)\K[^<] (?=</\1)" <<< "$xml_srx_name"
輸出
SRX-NAME
bash 演示
或sed與捕獲組一起使用:
xml_srx_name="<name>SRX-NAME</name>"
sed 's/.*<name>\([^<]\ \)<\/name>.*/\1/' <<< "$xml_srx_name"
sed 演示
uj5u.com熱心網友回復:
在每個 Unix 機器上的任何 shell 中使用任何 sed 或 awk:
$ xml_srx_name="<name>SRX-NAME</name>"
$ echo "$xml_srx_name" | awk -F'[<>]' '{print $3}'
SRX-NAME
$ echo "$xml_srx_name" | sed 's/.*>\(.*\)<.*/\1/'
SRX-NAME
任何包含的腳本SRX-NAME都是沒有意義的,因為這意味著您已經知道要查找的字串,因此可以echo 'SRX-NAME'改為這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/469185.html
下一篇:jq選擇所選路徑的子集
