Linux SED命令环境变量

gorkyyrv  于 2023-05-16  发布在  Linux
关注(0)|答案(2)|浏览(205)

我有两个变量,它们的输出如下所示。

echo $VAR_ONE
'https://url_one','https://url_two'

echo $VAR_TWO
'https://url_two'

我想从**$VAR_ONE中删除'https://url_two'(即$VAR_TWO),并设置为另一个变量**。我执行了下面的命令,但出现了一个错误。

VAR_THREE=$(echo $VAR_ONE | sed s/"$VAR_TWO"//)

sed: bad option in substitution expression

添加到脚本以及,但相同的错误

#!/bin/bash

VAR_ONE=$(echo "'https://url_one','https://url_two'")
VAR_TWO=$(echo "'https://url_two'")
VAR_THREE=$(echo $VAR_ONE | sed s/"$VAR_TWO"//)
ozxc1zmp

ozxc1zmp1#

使用bash,不需要外部调用。它的“模式替换”形式parameter expansion足够强大:

# generate a variable containing all legal 8-bit ASCII characters
# (I believe should work with utf, etc also, in appropriate locales)
all=$(perl -E 'say map chr,1..255')

# get an idea what it contains
echo "$all" | od -c
echo

# create variable containing two copies
var1="$all================$all"

new='----------------'

# replace first copy
echo "${var1/"$all"/"$new"}" | od -c
echo

# replace all copies
echo "${var1//"$all"/"$new"}"

输出:

0000000 001 002 003 004 005 006  \a  \b  \t  \n  \v  \f  \r 016 017 020
0000020 021 022 023 024 025 026 027 030 031 032 033 034 035 036 037    
0000040   !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /   0
0000060   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?   @
0000100   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P
0000120   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _   `
0000140   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p
0000160   q   r   s   t   u   v   w   x   y   z   {   |   }   ~ 177 200
0000200 201 202 203 204 205 206 207 210 211 212 213 214 215 216 217 220
0000220 221 222 223 224 225 226 227 230 231 232 233 234 235 236 237 240
0000240 241 242 243 244 245 246 247 250 251 252 253 254 255 256 257 260
0000260 261 262 263 264 265 266 267 270 271 272 273 274 275 276 277 300
0000300 301 302 303 304 305 306 307 310 311 312 313 314 315 316 317 320
0000320 321 322 323 324 325 326 327 330 331 332 333 334 335 336 337 340
0000340 341 342 343 344 345 346 347 350 351 352 353 354 355 356 357 360
0000360 361 362 363 364 365 366 367 370 371 372 373 374 375 376 377  \n
0000400

0000000   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -
0000020   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
0000040 001 002 003 004 005 006  \a  \b  \t  \n  \v  \f  \r 016 017 020
0000060 021 022 023 024 025 026 027 030 031 032 033 034 035 036 037    
0000100   !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /   0
0000120   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?   @
0000140   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P
0000160   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _   `
0000200   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p
0000220   q   r   s   t   u   v   w   x   y   z   {   |   }   ~ 177 200
0000240 201 202 203 204 205 206 207 210 211 212 213 214 215 216 217 220
0000260 221 222 223 224 225 226 227 230 231 232 233 234 235 236 237 240
0000300 241 242 243 244 245 246 247 250 251 252 253 254 255 256 257 260
0000320 261 262 263 264 265 266 267 270 271 272 273 274 275 276 277 300
0000340 301 302 303 304 305 306 307 310 311 312 313 314 315 316 317 320
0000360 321 322 323 324 325 326 327 330 331 332 333 334 335 336 337 340
0000400 341 342 343 344 345 346 347 350 351 352 353 354 355 356 357 360
0000420 361 362 363 364 365 366 367 370 371 372 373 374 375 376 377  \n
0000440

---------------================---------------
qacovj5a

qacovj5a2#

VAR_ONE="'https://url_one','https://url_two'"
VAR_TWO="'https://url_two'"
VAR_THREE="$(echo "$VAR_ONE" | sed s/"$VAR_TWO"//)"

解析为调用sed "s/'https://url_one','https://url_two'/'https://url_two'/",这显然是不正确的,因为sed s命令必须使用正好3个(非转义)分隔符来调用,而您的调用使用了其中的9个。
一种解决方案是使用一个分隔符,它既不是你的模式的一部分,也不是你的替换,例如:#

VAR_THREE="$(echo "$VAR_ONE" | sed "s#$VAR_TWO##")"

请注意,一旦您的URL包含#,此操作就会中断。我建议不要使用sed,而是调用awk,它可以正确地处理变量,并且可以在没有shell将它们插入程序的情况下这样做(这可以避免各种问题)。

VAR_THREE="$(echo "$VAR_ONE" | awk -v pattern="$VAR_TWO" '{sub(pattern,"");print}')"

相关问题