Чтобы получить список всех установленных приложений с их именами, самый простой способ:
sudo apt-get install aptitude
aptitude -F' * %p -> %d ' --no-gui --disable-columns search '?and(~i,!?section(libs), !?section(kernel), !?section(devel))'
Он предоставит вам список всех установленных пакетов, которые не являются библиотеками, а не ядра, а не пакет разработки, такой как:
* zip -> Archiver for .zip files
* zlib1g -> compression library - runtime
* zlib1g-dev -> compression library - development
* zsh -> shell with lots of features
* zsh-common -> architecture independent files for Zsh
Это более полно, так как в нем также перечислены не-gui-приложения, которые не будут отображаться в файлах .desktop
Я исправил это благодаря steeldriver & amp; дальнейшее возиться.
sed '{
s/"{//
s/}"//
s/^"//
/,\r/{N;/\n.*title.*:\s/{s/,\r\n.*title.*:\s/,/}}
s/""//g
s/^\s\+//
/^\s*$/d
s/^id:\ //
s/\\//g
}' QueryR* | tee "$1"
translation: s/"{// Удалить "{ s/}"// Удалить }" s/^"// Удалить " с начала строки /,\r/{N;/\n.*title.*:\s/{s/,\r\n.*title.*:\s/,\ /}} match ,\r на одном line и [whatever]title[whatever]: на следующей строке, замените все это на , s/""//g Удалите все оставшиеся двойные двойные кавычки s/^\s\+// Удалите пробелы с начала строк /^\s*$/d Удалите пустые строки s/^id:\ // Удалите id: и пространство после него s/\\//g Удаление обратных косых черт (escape-символы для «добавлены в некоторые поля заголовка») tee "$1" указать внешний файл при запуске скрипта, например ./queryclean newquery.csv
В то время как вопрос задает вопрос sed, можно было бы решить проблемы sed с Python:
from __future__ import print_function
import sys
with open(sys.argv[1]) as f:
for line in f:
if '""id""' in line:
print(line.strip().split(':')[1],end="")
if '""title""' in line:
title = " ".join(line.strip().split(':')[1:])
print(title.replace('""'," "))
Этот код совместим как с python2, так и с python3, поэтому либо будет работать
Пример прогона:
bash-4.3$ cat questions.txt
"{
""id"": 281952,
""title"": ""Flash 11.2 No Longer Supported by Google Play""
}"
"{
""id"": 281993,
""title"": ""Netbeans won't open in Ubuntu""
}"
bash-4.3$ python3 parse_questions.py questions.txt
281952, Flash 11.2 No Longer Supported by Google Play
281993, Netbeans won't open in Ubuntu
Еще три подхода:
awk$ awk -F'": ' '/\"id\"/{id=$NF;}
/\"title\"/{
t=$NF;
sub(/^""/,"",t);
sub(/""$/,"",t);
print id,t
}' OFS="" file
281952,Flash 11.2 No Longer Supported by Google Play
281993,Netbeans won't open in Ubuntu
Perl $ perl -lne '$id=$1 if /id"":\s*(\d+)/;
if(/title"":\s*""(.*)""/){print "$id,$1"}' file
281952,Flash 11.2 No Longer Supported by Google Play
281993,Netbeans won't open in Ubuntu
GNU grep с perl-совместимыми регулярными выражениями и простыми perl: $ grep -oP '(id"":\s*\K.*)|(title"":\s*""\K.*(?=""))' file |
perl -pe 'chomp if $.%2'
281952,Flash 11.2 No Longer Supported by Google Play
281993,Netbeans won't open in Ubuntu
Это не совсем ответ на ваш вопрос или решение вашей проблемы, но чтобы избавиться от нежелательных символов, вы можете использовать tr:
cat QueryR | tr -d '}{:"'
, и вы получите:
[d3 ]Это еще один скрипт, написанный на Ruby.
csvfile = File.open('query-fixed.csv', 'w')
File.open('QueryResults2.csv') do |f|
content = f.read
content.gsub!(/\r\n?/, "\n")
content.each_line do |line|
id, title = '', ''
if line.match('\"id\"')
id = line.split(':')[1].strip[0..-2]
csvfile.write(id + ',')
end
if line.match('\"title\"')
title = line.partition(':')[2].scan(/"(.*)"/)[0][0]
csvfile.write(title + "\n")
end
end
end
После запуска программы полученный результат будет выглядеть следующим образом:
281952,"Flash 11.2 No Longer Supported by Google Play"
281993,"Netbeans won't open in Ubuntu"
]