Я не уверен, где найти это в документации, но немного покопавшись в источнике, можно найти некоторые подсказки. Когда вы переходите в -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
для целого числа со знаком.
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
Кажется, я решил проблему, используя совпадение и подстроку:
'match($0, /REGEX/) {sub(/REGEX/, substr($0, RSTART, RLENGTH) ); print}'
Как насчет:
awk -F '.pgp' '{print $1 FS}'
У меня возникло бы искушение использовать perl -pe 's/\.pgp\K.*//'
вместо awk.
Я пытался использовать метод awk substr:
awk '{print substr($1,1,8)}' filename
Вывод:
Dogs.pgp
Dogs.pgp
Dogs.pgp