Как использовать однострочник sed для разбора "rec: id = 1 & name = zz & age = 21" в "1 zz 21"? - PullRequest
0 голосов
/ 02 марта 2012

Я могу объединить несколько замен sed и операцию awk, чтобы достичь этого, но есть ли одна замена sed, которая может это сделать?

Также есть ли другой инструмент, который больше подходит для этой задачи анализа?

Ответы [ 3 ]

2 голосов
/ 02 марта 2012

Вы можете попробовать:

sed -r 's!rec:id=(.*?)&name=(.*?)&age=(.*?)!\1 \2 \3!' input_file

Если вы не знаете rec:id и т. Д. Заранее, но знаете, что их три, вы можете попробовать:

sed -r 's![^=]+=(.*?)&[^=]+=(.*?)&[^=]+=(.*?)!\1 \2 \3!' input_file

Если вы заранее не знаете, сколько пар &name=value вам нужно, но хотите вывести все значения, вы можете попробовать что-то вроде:

grep -P -o '(?<==)([^&]*)(?=&|$)' | xargs

, где -P означает «регулярное выражение perl», регулярное выражение говорит «найдите строку, за которой следует & (или конец строки), и перед которой стоит знак равенства», -o означает печать только соответствует (т. е. 1, zz и 21) каждый на своей собственной строке, и | xargs перемещает их из своей собственной строки в одну строку и разделяет пробел (т. е. 1\nzz\n21 до 1 zz 21).

1 голос
/ 02 марта 2012

Это может работать для вас:

echo "rec:id=1&name=zz&age=21" | sed 's/[^=]*=\([^&]*\)/\1 /g'
1 zz 21 

Однако в конце остается дополнительное место для решения этой проблемы:

echo "rec:id=1&name=zz&age=21"|sed 's/[^=]*=\([^&]*\)/\1 /g:;s/ $//'
1 zz 21 
0 голосов
/ 03 марта 2012

Как насчет разбора значений непосредственно в переменные?

inbound="rec:id=1&name=zz&age=21"     
eval $(echo $inbound | cut -c5- | tr \& "\n")
echo "Name:$name, ID:$id, Age:$age"

Или даже лучше, хотя и немного более загадочно:

inbound="rec:id=1&name=zz&age=21"
IFS=\& eval $(cut -c5- <<< $inbound)
echo "Name:$name, ID:$id, Age:$age"
...