sed 찾기 및 슬래시로 바꾸기

sed 찾기 및 슬래시로 바꾸기

매개변수에서 슬래시를 찾기 위해 sed 찾기/바꾸기를 사용하는 데 문제가 있습니다.

test.sh의 샘플 콘텐츠

str=$(sed -n '/^user:/p' /tmp/shadowtest) # find "user:" line in /etc/shadowtest
arr=(${str//:/ }) # explode str with : as delimeter
arr=${arr[1]} # grab the 2nd element
sed -i 's|$arr|XXXXX|g' /tmp/shadowtest # Nothing gets replaced in shadowtest

/tmp/shadowtest의 샘플 콘텐츠

# junk here
user:$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0:16310:0:99999:7:::
# junk here

스크립트를 있는 그대로 실행하면 Shadowtest 파일의 어떤 것도 대체되지 않습니다. 하지만 sed 명령을 다음과 같이 변경하면

sed -i 's|99999|XXXXX|g' /tmp/shadowtest

좋은 결과.

답변1

$arr을 바꾸려면 작은따옴표 밖에 넣어야 합니다. 예를 들어:

sed -i "s|$arr|XXXXX|g" /tmp/shadowtest

답변2

귀하의 코드가 수행하는 작업을 올바르게 이해했다면 귀하의 예에서는 다음과 같습니다.

$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0

다음으로 교체해야 합니다:

XXXXX

이것이 사실이라면 쉘을 전혀 포함할 필요가 없습니다.

sed '/^user:/s/:[^:]*/:XXXXX/
' <<\DATA
# junk here
user:$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0:16310:0:99999:7:::
other:$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0:16310:0:99999:7:::
user:different stuff in this spot:16310:0:99999:7:::
# junk here
DATA

산출

# junk here
user:XXXXX:16310:0:99999:7:::
other:$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0:16310:0:99999:7:::
user:XXXXX:16310:0:99999:7:::
# junk here

string 으로 시작하는 줄만 처리한다는 점에서 사용자 자신과 동일한 방식으로 작동하지만(주로) 해당 줄 에서 함수를 실행하는 user:대신 함수를 실행합니다.ps///

:XXXXX문자열로 시작하는 줄에서 문자열 바로 뒤에 나오는 문자가 아닌 첫 번째 시퀀스 로 문자열을 바꿉니다 .::user:

관련 정보