Получите блок значений блоком в том же файле

Файл /etc/X11/app-defaults/XTerm определяет X ресурсов, используемых Xterm. X ресурсов являются значениями конфигурации, используемыми старомодным X приложений (приложения, которые появились перед современными средами, такими как Gnome и KDE, которые имеют их собственную, менее мощную систему конфигурации).

Не изменяйте системный файл. Вместо этого запишите свои собственные настройки в ~/.Xresources. Большинство установок читает этот файл автоматически, но на Cygwin, Вы, возможно, должны выполнить его вручную.

Установки ресурса имеют форму SETTING: VALUE где SETTING состоит из разделенных от точки имен. Имя является названием приложения, установку которого Вы указываете (здесь, XTerm), затем обнулите или более вложенные компоненты (“виджет”) и наконец имя ресурса. Страница руководства документирует имена ресурса.

XTerm.VT100.utf8: 1
XTerm.VT100.renderFont: true

Имена ресурса чувствительны к регистру. Названия StudlyCapsified определяют классы, в то время как строчные имена определяют экземпляры. Вы не должны действительно понимать то, что это означает; если это когда-нибудь подходит, знают, что настройки для экземпляра имеют приоритет по настройкам для класса.

3
10.06.2014, 02:43
5 ответов

Спасибо большое, ребята. Это тот кусок кода, который окончательно решил мою проблему.

nawk -v fname="${filename}" -F '/|:' '

    function isnum(x){return(x==x+0)}

    /P1/,/P3/{
            # Found start increment i reset variables go to next line
            if(/P1/){
                   ++i 
                   fid ="" 
                   count++
                   next
                }

            # Found end validate variable and print go to next line
            if(/P3/){
                printf "%s|",count
                printf "%s|",isnum(fid)?fid:"NULL"
                  next 
                }
            if(!fid && /36,59:*/)
                {
                    fid = $NF
                }
        ' ${filename} >>output.txt

Но теперь у меня есть другая проблема, для которой я создал отдельный поток.

Вот ссылка, если вы, ребята, можете помочь.

https://stackoverflow.com/questions/24277167/finding-and-replacing-text-inside-awk-block?noredirect=1#comment37509363_24277167

0
27.01.2020, 21:14

С perl (затуманивает весь файл в памяти):

 perl -0777 -ne 'while (/P1\n(.*?)\nP2/gs) {
   printf "Value%d:%s\n", ++$n, $1 =~ /^10,9.*\// ? $'\'': "NULL"}'
2
27.01.2020, 21:14

Другое решение awk :

$ awk '$0=="P1" {f=1} $0=="P2" {f=0}f' file | paste - - | \
    awk -F"\t" '$2~/[0-9]/ {split ($2,a,"/"); \
    print "Value"NR":"a[2]} $2!~/[0-9]/ {print "Value"NR":NULL"}'
Value1:123456
Value2:98765
Value3:NULL
1
27.01.2020, 21:14

Это работает и является полностью переносимый:

sed '\|^P1.*|!d;s||Value:|
     :n
     N;\|\nP2|!bn
     s|:.*\n10,9[^/]*/|:|
     s|\n.*||;s|:$|:NULL|' 

Поток работает следующим образом:

  1. Сначала он обращается к строке ^ , начинающейся с P1

  2. Если текущая строка ! не соответствует d выбирает.

  3. Если это так, он заменяет P1 на Значение:

  4. Затем устанавливает внешнюю метку : n и извлекает N внешняя линия.

  5. Если \ nP2 равно ! не обнаружил, а затем b возвращается к метке : n ext и пытается снова и снова, пока это не произойдет.

  6. Затем удаляются все вхождения :. * \ N10,9 до первого встречающегося символа / .

  7. Удаляет первую доступную \ n строку и все следующие символы.

  8. Если последним символом является : двоеточие после Value , вставляется строка NULL .

Шаги 6 и 7 - это то, что заставляет его работать. На этапе 6 он удаляет строку \ n , предшествующую желаемой числовой строке, но если этого нет, то следующий \ n ewline будет строкой, следующей сразу за Value: , поэтому все перейдет на шаг 7.

Вот оно в действии:

sed '\|^P1.*|!d;s||Value:|
     :n
     N;\|\nP2|!bn
     s|:.*\n10,9[^/]*/|:|
     s|\n.*||;s|:$|:NULL|' <<\DATA
P1
10,9:6/123456
P2
blah blah
P1
10,9:5/98765
P2
blah
blah
P1
blah blah
P2
DATA

OUTPUT:

Value:123456
Value:98765
Value:NULL
2
27.01.2020, 21:14

Решение perl :

$ perl -F'/' -alne '
    if (/P1/../P2/ and $_ !~ /^P/) {
        print "Value@{[++$i]}:",$F[1]?$F[1]:"NULL";
    }
' file
Value1:123456
Value2:98765
Value3:Null

Решение awk :

$ awk -F'/' '/P2/{f=0};/P1/{f=1;next};f{print "Value"++i":"($2?$2:"Null")}' file
Value1:123456
Value2:98765
Value3:Null
1
27.01.2020, 21:14

Теги

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