복붙노트

[REDIS] xargs를 변수에 나오지도 사용 쉘 확장 내부에서 작동하지 않습니다

REDIS

xargs를 변수에 나오지도 사용 쉘 확장 내부에서 작동하지 않습니다

나는 각 키 이름에 대한 교체가 나오지 셸을 사용하여, 레디 스에 배치 키의 이름 변경을 시도하고있다. (내부적으로 레디 스에서이 작업을 수행하는 더 나은 방법이있을 것 같지 않습니다).

redis-cli -n 5 KEYS "*::staging::*"| xargs -I {} echo "RENAME {} $(echo {} | sed 's/staging/development/g')" 
# Then pipe this command into redis-cli when working

이 같은 출력을 기대하고있다 : "RENAME은 레디 스 :: 준비 :: 키 레디 스 :: 개발 :: 키"

대신 난 그냥이 얻을 : "RENAME은 레디 스 :: 준비 :: 키 레디 스 :: 준비 :: 키를"

에코 {} $ (에코 {} | 나오지도의 / 기존 / 신규 / ') 나를 걸려 것입니다 ... 한 사람이 어떻게 제대로 xargs를 출력을 복용 달성하고 원본과 그의 편집 된 버전을 모두 에코는 무엇입니까? $은 (에코 {} | 나오지도) 잘 작동 하는가? (그렇다면, 어떻게 제대로 할 수 있습니까?)

해결법

  1. ==============================

    1.자체 나오지도 모두 수정되지 않은 및 수정 된 라인을 생성 할 수 있습니다 :

    자체 나오지도 모두 수정되지 않은 및 수정 된 라인을 생성 할 수 있습니다 :

    $ echo "redis::staging::key" | sed 's/^/RENAME /; p; s/staging/development/g'
    RENAME redis::staging::key
    RENAME redis::development::key
    

    상기에서, 첫번째 행의 시작에 RENAME 문자열을 추가 sed는. 그런 다음 p 명령은 (여전히에서 "준비"로) 그 당시의 약자로 선을 인쇄 나오지도 알려줍니다. 다음 대체 "개발"에두고 다음 버전도 인쇄됩니다.

    업데이트 : 우리가 한 줄에 출력을 원하는 가정하자 :

    $ echo "redis::staging::key" | sed 's/.*/RENAME & &/; s/staging/development/2'
    RENAME redis::staging::key redis::development::key
    

    첫 번째의 위 명령을 처음으로 이름 바꾸기를 추가하고, 행을 두 배로. 두 번째는 개발 준비의 두 번째 발생을 대체합니다.

    xargs -I {} echo "RENAME {} $(echo {} | sed 's/staging/development/g')"
    

    xargs를이 실행 전에 배쉬는 문자열을 처리합니다. 특히,이 $ 본다 (에코 {} | 나오지도의 / 준비 / 개발 / g ')하고 ( "명령 대체를")를 실행하고 결과를 얻을 수 {}. xargs를 마지막으로 실행될 때 그래서, 그것은 명령 본다 :

    xargs -I {} echo "RENAME {} {}"
    

    결과적으로, S / 준비 / 개발 / g 대체 IS하지 않았다.

    이것에 대한 수정이 있습니다 :

    $ echo "redis::staging::key" | xargs -I {} sh -c 'echo RENAME {} $(echo {} | sed 's/staging/development/g')'
    RENAME redis::staging::key redis::development::key
    

    위의 작은 따옴표 안에두고 bash는 명령과는 쉬에 인수로 전달합니다. xargs를 후 치환했다까지이 방법으로, 문자열은 쉘에 의해 처리되지 않는다.

  2. from https://stackoverflow.com/questions/21636184/using-sed-on-xargs-variable-isnt-working-inside-shell-expansion by cc-by-sa and MIT license