ДО regex для разделения () представляют в виде строки между разделителем и концом слова

^C отправьте сигнал прерывания, который может быть обработан программой (можно проигнорировать его),

kill -9 отправьте сигнал sigkill, который закрывает программу, которую Вы не можете обработать.

Вот почему Вы не можете закрыть некоторые программы с ^C

5
15.01.2014, 20:35
3 ответа

Используемое решение

Это - в действительности, реализация ответа glenn с добавлением пользовательской функции stringSplit() использовать вместо Простофили 3.1.6 встроенных split() функция, которая не поддерживает дополнительный 4-й аргумент ([seps], массив для содержания разделителей), что нам нужно. Простофиля 3.1.6 действительно поддерживает подобную цель дополнительный 3-й аргумент match() необходимый, но [seps] не доступно до Простофили 4.0.0.

# stringSplit(str,fld,rx,[sep])
#     Split string on regex delimeter preserving regex-seperators. Gawk 3.1.6
#     equivalent to builtin split() function of later versions which add
#     support for an optional 4th argument, ([seps]), an array to hold the
#     evaluated regular-expressions.
# Arguments:
#     str
#       string to split
#     fld
#       array of the resulting fields
#     rx
#       regular expression (regex) to split on
#     [sep]
#       optional array of seperator strings matching the regex
# Revised:
#     20140117 docsalvage
#
function stringSplit(str,fld,rx,sep,    searchstr,searchndx,match1,matchn,matches) {
  searchstr = str                     # copy of str to use in while() loop
  searchndx = match(searchstr, rx)    # index in searchstr where rx(regex) found
  match1    = searchndx               # preserve result of first match attempt
  matchn    = 1                       # match number (index in array of matches)
  matches   = 0                       # number of matches returned by split()
  #
  while (RLENGTH > 0) {               # more reliable than while(searchndx > 0)
    # save match
    sep[matchn] = substr(searchstr, searchndx, RLENGTH)
    #
    # match() only searches from beginning so give it just remainder of str
    searchstr   = substr(searchstr, searchndx + RLENGTH)
    #
    # printf("sep[%2d]: %s, searchndx: %2d, RLENGTH: %2d, searchstr: %s\n", matchn, sep[matchn], searchndx, RLENGTH, searchstr)
    #
    # search for next rx
    searchndx = match(searchstr, rx)
    matchn = matchn + 1
  }
  #
  if (match1)  matches = split(str,fld,rx)
  #
  return matches
}

BEGIN {
  print
  print "Test of:"
  print "  stringSplit()"
  print
  #
  str = "[[link|label label]][[link]] @tag more text some text with @anothertag and [[another|link]]"
  rx  = "[][][][]|@[[:alnum:]]+"
  #
  # fld - array of fields
  # sep - array of seperators
  #
  tags = 0
  matches = stringSplit(str,fld,rx,sep)
  #
  # arrayDebug("fld",fld)
  # arrayDebug("sep",sep)
  # print
  #
  print "Results:"
  printf "  "
  # per glenn jackman answer at
  #   http://unix.stackexchange.com/questions/109491/the-ere-regex-to-split-string-between-a-delimiter-and-end-of-word
  for (i=1; i<=matches; i++) {
    printf "(%s)", fld[i]
    if (match(sep[i], /^@(.+)/, m))  { printf "(%s)", m[1]; ++tags }
  }
  #
  print
  print
  print "Summary:"
  printf("  %d matches + %d tags = %d printed using regex(rx): %s\n  on string(str): %s\n", matches, tags, matches + tags, rx, str)
  print
}
0
27.01.2020, 20:39

Я не думаю, что можно сделать это в единственном regex, но так как Вы используете простофилю, можно использовать некоторые расширения простофили:

awk '{
    n = split($0, a, /\[\[|\]\]|@[[:alnum:]]+/, s)
    for (i=1; i<=n; i++) {
        printf "(%s)", a[i]
        if (match(s[i], /^@(.+)/, m))
            printf "(%s)", m[1]
    }
    print ""
}' <<END
[[link|label label]] [[link]] @tag more text
some text with @anothertag and [[another|link]]
END
()(link|label label)( )(link)( )(tag)( more text)
(some text with )(anothertag)( and )(another|link)()
4
27.01.2020, 20:39
  • 1
    , К сожалению, 4-й аргумент разделению (), от которого это зависит, не поддерживается в 3.1.6. Однако я записал функцию для использования вместо разделения (), который делает. Не будет с такой скоростью, как встроенное, но awk так быстр во всяком случае, он не надеется быть проблемой. Все еще тестирование. Отправит при усовершенствовании.Большое спасибо! –  DocSalvager 17.01.2014, 11:41

Это ужасно и ужасно, но обеспечивает желаемый вывод:

$ echo '[[link|label label]] [[link]] @tag more text' | 
 awk -vFS="[\\\\[\\\\] @]" '{
  OFS=":"; 
  printf "\n(" $1 ")(" $3" "$4 ")(" $5 ")(" $9 ")(" $10 ")(" $13 ")("; 
  rest=$14;
  for(i=15;i<=NF;i++){rest=rest" "$(i)}
  printf "%s)\n", rest;

 }'
()(link|label label)()(link)()(tag)(more text)

Прием устанавливает разделителя полей на любой из [,],@ или (пространство). Если можно сделать так в рамках программы, она должна дать желаемый вывод.

1
27.01.2020, 20:39

Теги

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