shell 如何替换参数的值

ccrfmcuu  于 2023-01-17  发布在  Shell
关注(0)|答案(2)|浏览(157)

如何逐步替换参数的值。
我的意思是,
例如- URL为https://example.com/?p=first&q=second&r=third
首先,我想在p param https://example.com/?p=123&q=second&r=third上添加“123
然后再次使用相同的URL但不同的参数,例如q param https://example.com/?p=first&q=123&r=third
同样使用相同的URL但不同的参数,
https://example.com/?p=first&q=second&r=123
我尝试了:

while read line; do
first_part=`echo $line | cut -d'=' -f1`                                          second_part=`echo $line | cut -d'=' -f2`

    echo "${first_part}=123${second_part}"

    echo "${first_part}${second_part}=123"

done < urls.txt
gajydyqb

gajydyqb1#

所描述的问题是AWK功能的一个很好的应用。演示脚本包括URL和一个Map函数文件的示例,用于URL的全局转换。
这种方法允许参数“自由浮动”,而不依赖于URL字符串中特定顺序位置的匹配。
这种方法还允许参数是任意长度的字符串。

#!/bin/bash

#QUESTION:  https://stackoverflow.com/questions/75124190/how-to-replace-the-values-of-a-param

cat >URL.list <<"EnDoFiNpUt"
https://example.com/?p=first&q=second&r=third
https://example.com/?r=zinger
https://example.com/?r=bonkers&q=junk&p=wacko
https://example.com/?p=flyer
EnDoFiNpUt

cat >mapfile.txt <<"EnDoFiNpUt"
q=SECOND
r=THIRD
p=FIRST
EnDoFiNpUt

awk -v datFile="mapfile.txt" 'BEGIN{
    ## Initial loading of the mapping file into array for comparison
    split( "", transforms ) ;
    indexT=0 ;
    while( getline < datFile ){
        indexT++ ;
        transforms[indexT]=$0 ;
    } ;
}
{
    ### Split off beginning of URL from parameters
    qPos=index( $0, "?" ) ;
    beg=substr( $0, 1, qPos ) ; 

    ### Load URL elements into array for comparison
    rem=substr( $0, qPos+1 ) ;
    n=split( rem, parts, "&" ) ;

    ### Match and Map transforms elements with URL parts
    for( k=1 ; k<= indexT ; k++ ){
        dPos=index( transforms[k], "=" ) ;
        fieldPref=substr( transforms[k], 1, dPos ) ;
        for( i=1 ; i<=n ; i++ ){
            if( parts[i] ~ fieldPref ){
                parts[i]=transforms[k] ;
            } ;
        } ;
    } ;

    ### Print transformed URL
    printf("%s%s", beg, parts[1] ) ;
    for( i=2 ; i<=n ; i++ ){
        printf("&%s", parts[i] ) ;
    } ;
    print "" ;
}' URL.list

输出如下所示:

https://example.com/?p=FIRST&q=SECOND&r=THIRD
https://example.com/?r=THIRD
https://example.com/?r=THIRD&q=SECOND&p=FIRST
https://example.com/?p=FIRST
00jrzges

00jrzges2#

根据规范,HTML参数是无序的,所以你可以简单地把p=的新值放在尾部而不是原来的位置:

echo 'https://example.com/?p=first&q=second&r=third' |
mawk NF=NF FS='p=[^&]*[&]?' OFS= ORS='&p=123\n'

对于q=相同。
如果您要修改r=,则将FSOFS都设置为"=",并像$NF的普通值更新一样执行此操作

相关问题