텍스트 변수를 통해 Firefox 홈페이지를 동적으로 변경하는 스크립트를 작성 중입니다.
sed -i 's|\("browser.startup.homepage",\) "\(.*\)"|\1 "$ddrs"|' /home/max/.mozilla/firefox/*.default/prefs .js
$ddrs
작은따옴표 문 내에서 변수를 확장하는 문제를 해결해야 합니다 sed
.
답변1
큰따옴표와 같은 특수 문자 이스케이프 처리를 줄이려면($
당신이 그것을 사용 한다면), 변수 자체를 큰따옴표로 묶고 나머지는 작은따옴표로 묶을 수 있습니다. 그 사이에는 공간이 없습니다.
's|\("browser.startup.homepage",\) "\(.*\)"|\1 '"$ddrs"' |'
또한 두 번째 값을 인용하지 않으므로 괄호를 사용할 이유가 없습니다.
's|\("browser.startup.homepage",\) ".*"|\1 '"$ddrs"' |'
$ddrs
마찬가지로 변수 값을 큰따옴표로 표시 하려면파일에편집할 때 다음과 같은 큰따옴표를 포함해야 합니다.
's|\("browser.startup.homepage",\) ".*"|\1 "'"$ddrs"'" |'
그러나 한 줄에 여러 값이 있을 수 있다는 생각이 들었습니다(또는 가질 수도 있었습니다.) sed 정규 표현식은 탐욕스럽기 때문에 .*
일치합니다.나머지 줄에게마지막큰따옴표. 탐욕스럽지 않게 만들려면(이 특정 사용 사례의 경우) 큰따옴표를 제외한 모든 항목과 일치하는 문자 클래스를 사용하세요.
's|\("browser.startup.homepage",\) "[^"]*"|\1 "'"$ddrs"'" |'
그리고 실수로 일치할 가능성은 거의 없지만 .
첫 번째 문자열의 점( )은 점과 일치하지 않고 문자 클래스 "모든 단일 문자"와 일치합니다. 이를 피하려면 다음과 같이 이스케이프해야 합니다.
's|\("browser\.startup\.homepage",\) "[^"]*"|\1 "'"$ddrs"'" |'
쉼표 구분 기호를 사용하는 것처럼 보이지만 공백 두 개나 0이 아닌 쉼표 뒤의 공백 하나만 일치합니다. 공간이 몇 군데나 있는 것 같아요가능한이므로 견고성을 위해 쉼표와 큰따옴표 사이에 임의의 공백을 허용하십시오.
's|\("browser\.startup\.homepage",\) *"[^"]*"|\1 "'"$ddrs"'" |'
여기에는 다른 명백한 문제가 없습니다. (1) 후행 공백은 의도적인 것이라고 가정합니다. (2) |
URL(의 내용)에 나타나지 않는다고 가정하면 상당히 안전한 문자라고 생각합니다 $ddrs
. 여기에서 탈출하는 것은 읽기에 약간 악몽이지만, 이 특정한 용도에서는 sed
피할 수 없다고 생각합니다.
견고성을 희생하지 않고 가독성을 위해 노력하는 것이 좋지만 견고성은 가독성보다 더 중요합니다.
답변2
홈페이지 URL 데이터베이스에서 임의의 페이지로 다시 리디렉션되는 단일 URL로 홈페이지를 설정하는 것이 더 간단하지 않습니까?
이렇게 하면 브라우저를 다시 시작할 때마다가 아니라 홈을 클릭할 때마다(또는 홈으로 이동하는 새 탭/페이지를 열 때마다) 홈페이지 무작위화가 발생합니다. 또한 항상 Firefox 구성이 엉망이 되는 것을 방지합니다.
이를 수행하는 가장 쉬운 방법은 CGI 스크립트를 지원하는 곳에 최소한의 웹 서버를 설치하고 모든 요청에 대해 URL 리디렉션을 발행하는 간단한 CGI를 작성하는 것입니다. URL은 간단한 데이터베이스에서 가져옵니다(텍스트 파일일지라도 파일은 괜찮습니다). 도)).
답변3
"
다음과 같이 전체 sed 매개변수 주위에 따옴표를 사용하고 기존 따옴표를 이스케이프 처리해 보세요 .
sed -i "s|\(\"browser.startup.homepage\",\) \"\(.*\)\"|\1 \"$ddrs\" |" /home/max/.mozilla/firefox/*.default/prefs.js
설명하다
sed에 전달한 원래 매개변수는 다음과 같습니다.
's|\("browser.startup.homepage",\) "\(.*\)"|\1 "$ddrs" |'
- 구문을 사용하십시오
s|search|replace|
. - 그러나 리터럴 따옴표를 사용하면
'
bash 확장이 방지되므로 Bash 확장이 없습니다$ddrs
.$ddrs
이 매개변수를 다음과 같이 수정하면 됩니다.
"s|\(\"browser.startup.homepage\",\) \"\(.*\)\"|\1 \"$ddrs\" |"
- 그러나 따옴표를 사용하고 있으므로 원본을 다음으로 바꿔서 이스케이프
"
해야 합니다."
\"
"
이제 따옴표로 묶 였으므로 Bash는 성공적으로 확장됩니다.$ddrs
답변4
나는 스스로 해결책을 찾았습니다.
줄 내의 대상 문자열을 멋진 것으로 바꾸라고 주장하는 대신 전체 줄을 바꾸기로 결정했습니다.
urls.txt
먼저 파일을 디렉토리에 넣었습니다~/.mozilla/firefox/*.default/
.- 그런 다음 파일 시작 부분에 다음 코드를 작성했습니다
/usr/lib/firefox/firefox.sh
.
ddrs=$(shuf -n1 ~/.mozilla/firefox/*.default/urls.txt) nwli="user_pref(\"browser.startup.homepage\", "$ddrs");" sed -i "/browser.startup.homepage/c\\$nwli" ~/.mozilla/firefox/*.default/prefs.js