Подстрока без удаления символа поля

Я не уверен, где найти это в документации, но немного покопавшись в источнике, можно найти некоторые подсказки. Когда вы переходите в -h, он устанавливает histheight(, см. экран . c). В mainон анализирует -hследующим образом:

case 'h':
    if (--argc == 0)
        exit_with_usage(myname, NULL, NULL);
    nwin_options.histheight = atoi(*++argv);
    if (nwin_options.histheight < 0)
        exit_with_usage(myname, "-h: %s: negative scrollback size?", *argv);
    break;

Структура nwin_optionsявляется экземпляром NewWindow, который определен в window.h:

struct NewWindow {
    int StartAt;    /* where to start the search for the slot */
    char    *aka;       /* aka string */
    char    **args;     /* argv vector */
    char    *dir;       /* directory for chdir */
    char    *term;      /* TERM to be set instead of "screen" */
    bool    aflag;
    bool    dynamicaka;
    int flowflag;
    int lflag;
    int histheight;
    int monitor;
    int wlock;      /* default writelock setting */
    int silence;
    bool    wrap;
    bool    Lflag;      /* logging */
    int slow;       /* inter character milliseconds */
    int gr;
    bool    c1;
    int bce;
    int encoding;
    char    *hstatus;
    char    *charset;
    int poll_zombie_timeout;
};

, где мы можем видеть, что histheightявляется целым числом, поэтому, по-видимому, максимальное значение, которое вы можете установить, равно maxintдля целого числа со знаком.

0
23.04.2019, 21:16
4 ответа
for string in Dogs.pgp.123sda Dogs.pgpsjaksdasdasdaw Dogs.pgp-asasdawad2
do
    printf '%s --> %s\n' "$string" "${string%${string#*.???}}"
done

Выход:

Dogs.pgp.123sda --> Dogs.pgp
Dogs.pgpsjaksdasdasdaw --> Dogs.pgp
Dogs.pgp-asasdawad2 --> Dogs.pgp

Цикл перебирает три строки. В теле цикла исходная строка печатается вместе с преобразованной строкой.

Строка преобразуется путем удаления всего, кроме части перед первой точкой в ​​строке и трех символов, следующих за точкой.

Для этого сначала нужно выяснить, что нужно удалить из исходной строки. Это ${string#*.???}, т.е. остаток строки после удаления до первой точки и еще трех символов. Затем он удаляется с конца строки через ${string%${string#*.???}}.

Если цикл повторяется по именам файлов , совпадающим, например. *.pgp*, то это также будет обрабатывать случаи, когда имена файлов содержат символы новой строки. Единственное, что могло бы сбить с толку приведенное выше преобразование, это если бы перед подстрокой .pgpбыли точки, но вы могли бы справиться с этим, явно сопоставив .pgpвместо.???:

for fname in *.pgp*
do
    printf '%s --> %s\n' "$fname" "${fname%${fname#*.pgp}}"
done
1
28.01.2020, 02:30

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

'match($0, /REGEX/) {sub(/REGEX/, substr($0, RSTART, RLENGTH) ); print}'
0
28.01.2020, 02:30

Как насчет:

awk -F '.pgp' '{print $1 FS}'

У меня возникло бы искушение использовать perl -pe 's/\.pgp\K.*//'вместо awk.

1
28.01.2020, 02:30

Я пытался использовать метод awk substr:

awk '{print substr($1,1,8)}' filename

Вывод:

Dogs.pgp
Dogs.pgp
Dogs.pgp
0
28.01.2020, 02:30

Теги

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