매개변수에서 슬래시를 찾기 위해 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:
대신 함수를 실행합니다.p
s///
:XXXXX
문자열로 시작하는 줄에서 문자열 바로 뒤에 나오는 문자가 아닌 첫 번째 시퀀스 로 문자열을 바꿉니다 .:
:
user: