Серии команд sed работают в командной строке, но не в скрипте

Чтобы получить список всех установленных приложений с их именами, самый простой способ:

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

1
задан 18 September 2016 в 14:29

5 ответов

Я исправил это благодаря 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

5
ответ дан 23 May 2018 в 06:02

В то время как вопрос задает вопрос 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 
4
ответ дан 23 May 2018 в 06:02

Еще три подхода:

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
4
ответ дан 23 May 2018 в 06:02

Это не совсем ответ на ваш вопрос или решение вашей проблемы, но чтобы избавиться от нежелательных символов, вы можете использовать tr:

cat QueryR | tr -d '}{:"' 

, и вы получите:

[d3 ]

4
ответ дан 23 May 2018 в 06:02
  • 1
    спасибо, мне нужно научиться использовать tr :) – Zanna 18 September 2016 в 10:22
  • 2
    Это не так сильно, как sed или awk , но это очень просто для такого рода вещей. Приветствия :) – kcdtv 19 September 2016 в 20:18

Это еще один скрипт, написанный на 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"
]
1
ответ дан 23 May 2018 в 06:02

Другие вопросы по тегам:

Похожие вопросы: