sed 문 편집

sed 문 편집

텍스트 변수를 통해 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

나는 스스로 해결책을 찾았습니다.
줄 내의 대상 문자열을 멋진 것으로 바꾸라고 주장하는 대신 전체 줄을 바꾸기로 결정했습니다.

  1. urls.txt먼저 파일을 디렉토리에 넣었습니다 ~/.mozilla/firefox/*.default/.
  2. 그런 다음 파일 시작 부분에 다음 코드를 작성했습니다 /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

관련 정보