[英]Find and replace in same string in bash
我有一個帶有一些單詞的字符串,例如a=1 b=2 c=3 a=50
。 現在我想解析它並創建另一個字符串a=50 b=2 c=3
與上面的字符串基本相同,不同之處在於,如果第二次遇到=
之前的相同短語,則第一個字符串a=50 b=2 c=3
字符串覆蓋一個,所以最后在=
的左邊只有唯一的短語。 這是到現在為止我得到的:
a="a=1 b=2 c=3 a=50"
o=()
for i in $a
do
reg=${i%=*}
if [[ ${o[*]} == *"$reg"* ]]
then
o=$(echo ${o[*]} | sed -e "s/\$reg=\S/\$i")
else
o+=( $i )
fi
done
我在這里做錯了什么?
我會采用完全不同的方法, 而不是基於正則表達式或字符串重寫。
declare -A values=( ) # Initialize an associative array ("hash", "map")
while IFS= read -r -d' ' word; do # iterate over input words, separated by spaces
if [[ $word = *=* ]]; then # ignore any word that doesn't have an "=" in it
values[${word%%=*}]=${word#*=} # add everything before the "=" as a key...
fi # ...with everything after the "=" as a value
done
for key in "${!values[@]}"; do # Then iterate over keys we found
value="${values[$key]}" # ...extract the values for each...
printf '%s=%s ' "$key" "$value" # ...and print the pairs.
done
echo # When done iterating, print a newline.
由於單詞是通過字符串進行優先處理的,因此更新將在到達打印循環之前生效。
awk
$ awk -F= -v RS=" |\n" '{a[$1]=$2} END{for (k in a) printf "%s=%s ",k,a[k]}' <<<"a=1 b=2 c=3 a=50"
a=50 b=2 c=3
這個怎么運作:
-F=
將字段分隔符設置為等號。
-v RS=" |\\n"
將記錄分隔符設置為空格或換行符。
a[$1]=$2
用最新值更新關聯數組a
。
END{for (k in a) printf "%s=%s ",k,a[k]}
以不特定的順序打印最終值。
bash
就像Charles Duffy的方法一樣,它使用read -d" "
來解析字符串。 但是,這種方法使用IFS="="
來分隔名稱和值。
需要兩個循環。 第一個收集值。 第二次以原始順序重新組合更新的值:
a="a=1 b=2 c=3 a=50"
declare -A b
while IFS== read -d" " name value
do
b["$name"]="$value"
done <<<"$a "
declare -A seen
while IFS== read -d" " name value
do
[ "${seen[$name]}" ] || o="$o $name=${b["$name"]}"
seen[$name]=1
done <<<"$a "
echo "$o"
使用perl輕松完成:
echo "a=1 b=2 c=3 a=50" \
| sed "s/ /\n/g" \
| perl -e '
my %hash = ();
while(<>){
$line = $_;
if($line =~ m/(\S+)=(\S+)/) {
$hash{$1} = $2;
}
}
for $key (sort keys %hash) {
print "$key=$hash{$key}\n";
}'
...或者全部一行:
echo "a=1 b=2 c=3 a=50" | sed "s/ /\n/g" | perl -e 'my %hash = (); while(<>){ $line = $_; if($line =~ m/(\S+)=(\S+)/) { $hash{$1} = $2; } } for $key (sort keys %hash) { print "$key=$hash{$key}\n"; }'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.