Bash: сделать переменную из каждой строки в кавычках в блоке строк в кавычках - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь написать скрипт, который будет проходить через каждый сервис в разделе Shortcuts > Services в Keyboard Preference Pane и отключать его.

Это основная команда для отключения службы:

defaults write pbs NSServicesStatus -dict-add SERVICE "
<dict>
<key>enabled_context_menu</key><false/>
<key>enabled_services_menu</key><false/>
<key>key_equivalent</key><string>""</string>
</dict>
"  

Неэффективно заранее устанавливать все службы и помещать их в сценарий, поскольку многие службы добавляются постепенно при установке нового программного обеспечения. Это должна быть какая-то петля.

До сих пор я пытался использовать defaults и awk для получения каждой строки, содержащей сервис.

a=$(defaults read pbs NSServicesStatus | awk 'NR%5==2' ) && echo $a

И это вывод:

"com.ScooterSoftware.BeyondCompare - Compare Files - bcCompareFiles" = { "com.ScooterSoftware.BeyondCompare - Compare Folders - bcCompareFolders" = { "com.ScooterSoftware.BeyondCompare - Select Left File for Compare - bcSelLeftFile" = { "com.ScooterSoftware.BeyondCompare - Select Left Folder for Compare - bcSelLeftFolder" = { "com.apple.BluetoothFileExchange - Send File To Bluetooth Device - sendFileUsingBluetoothOBEXService" = { "com.apple.ChineseTextConverterService - Convert Text from Simplified to Traditional Chinese - convertTextToTraditionalChinese" = { "com.apple.ChineseTextConverterService - Convert Text from Traditional to Simplified Chinese - convertTextToSimplifiedChinese" = { "com.apple.ChineseTextConverterService - Convert Text to Full Width - convertTextToFullWidth" = { "com.apple.ChineseTextConverterService - Convert Text to Half Width - convertTextToHalfWidth" = { "com.apple.Dictionary - Look Up in Dictionary - doLookupService" = { "com.apple.FolderActionsSetup - Folder Actions Setup - openFilesFromPasteboard" = { "com.apple.Grab - Capture Selection from Screen - variableSelection" = { "com.apple.ImageCaptureService - Import Image - ImportImage" = { "com.apple.QuickTime.service.encodeSelectedAudioFiles - Encode Selected Audio Files - runWorkflowAsService" = { "com.apple.Safari - Add to Reading List - addToReadingList" = { "com.apple.Safari - Search With %WebSearchProvider@ - searchWithWebSearchProvider" = { "com.apple.ScriptEditor2 - Script Editor/Get Result of AppleScript - runAsAppleScript" = { "com.apple.SpotlightService - SEARCH_WITH_SPOTLIGHT - doSearchWithSpotlight" = { "com.apple.Stickies - Make Sticky - makeStickyFromTextService" = { "com.apple.Terminal - New Terminal Tab at Folder - newTerminalAtFolder" = { "com.apple.Terminal - New Terminal at Folder - newTerminalAtFolder" = { "com.apple.Terminal - Open man Page in Terminal - openManPage" = { "com.apple.Terminal - Search man Page Index in Terminal - searchManPages" = { "com.apple.finder - Finder/Open - open" = { "com.apple.finder - Finder/Reveal - reveal" = { "com.apple.finder - Finder/Show Info - showInfo" = { "com.apple.mail - Mail/New Email To Address - mailTo" = { "com.apple.mail - Mail/New Email With Selection - mailSelection" = { "com.apple.services.addToiTunesAsSpokenTrack - Add to iTunes as a Spoken Track - runWorkflowAsService" = { "com.apple.services.encodeSelectedVideoFiles - Encode Selected Video Files - runWorkflowAsService" = { "com.apple.services.setDesktopPicture - Set Desktop Picture - runWorkflowAsService" = { "com.apple.services.showMap - Show Map - runWorkflowAsService" = { "com.apple.systemuiserver - Open URL - openURL" = { "com.evernote.Evernote - ENApplicationServiceMenuItemTitle - serviceCreateNote" = { "com.flexibits.cardhop.mac - Send to Cardhop - sendToCardhop" = { "com.flexibits.fantastical2.mac - Send to Fantastical 2 - sendToFantastical" = { "com.houdah.HoudahSpot4 - New HoudahSpot Search - newSearch" = { "com.houdah.HoudahSpot4 - Search Folders in HoudahSpot - folderSearch" = { "com.houdah.HoudahSpot4 - Search in HoudahSpot - search" = { "com.kapeli.dashdoc - Create Snippet in Dash - createSnippetService" = { "com.kapeli.dashdoc - Look Up in Dash - lookupService" = { "net.pornel.ImageOptim - ImageOptimize - handleServices" = { }

Где каждая строка в кавычках представляет службу.

Вот мои вопросы:

Я пытался удалить все посторонние данные и пробелы (=, { и }) с помощью этой команды sed, но не смог избавиться от этого единственного, завершающего } .

b=$(echo $a | sed -E -e 's/ = { / /g' ) && echo "${b}"

Даже без завершающего } (который в любом случае приведет к ошибке только на последней итерации, или, как я полагаю), ни одна строка не была правильно проанализирована в этом цикле, который я сделал:

for service in "${b}"; do
defaults write pbs NSServicesStatus -dict-add "${service}" "
<dict>
<key>enabled_context_menu</key><false/>
<key>enabled_services_menu</key><false/>
<key>key_equivalent</key><string>""</string>
</dict>
"
done

Я использовал следующую команду только для тестирования и не получил действительный результат:

/usr/libexec/PlistBuddy -c "Print :NSServicesStatus:${service}" ~/Library/Preferences/pbs.plist

Кажется, только если служба анализируется правильно, и я не знаю, какая из них:

Dict {
    key_equivalent = 
    enabled_context_menu = false
    enabled_services_menu = false
}

Как мне решить эту проблему?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Когда я правильно понимаю ваши данные, вы можете получить услуги с помощью

echo "$b" | tr '{' '\n' | sed -rn 's/[^"]"(.*)".*/\1/p'

Вы можете повторить структуру defaults ..., используя

echo "$b" | tr '{' '\n' | sed -rn 's/[^"]"(.*)".*/\1/p' |
   xargs -I xxx echo 'defaults write pbs NSServicesStatus -dict-add "xxx" "
<dict>
<key>enabled_context_menu</key><false/>
<key>enabled_services_menu</key><false/>
<key>key_equivalent</key><string>""</string>
</dict>"
'

Если вы хотите вызвать программу defaults, вторая echo может быть удалена.

echo "$b" | tr '{' '\n' | sed -rn 's/[^"]"(.*)".*/\1/p' | 
   xargs -I xxx defaults write pbs NSServicesStatus -dict-add "xxx" "
<dict>
<key>enabled_context_menu</key><false/>
<key>enabled_services_menu</key><false/>
<key>key_equivalent</key><string>""</string>
</dict>"
0 голосов
/ 05 ноября 2018

Я на самом деле не оправдываю синтаксический анализ или генерацию структурированных данных с помощью инструментов, не имеющих структуры, но игнорирую это -

while IFS= read -r service; do
  service=${service%'"'}; service=${service#'"'}
  defaults write pbs NSServicesStatus -dict-add "${service}" '
  <dict>
  <key>enabled_context_menu</key><false/>
  <key>enabled_services_menu</key><false/>
  <key>key_equivalent</key><string>""</string>
  </dict>
  '
done < <(egrep -o '"[^"]+"' <<<"$a")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...