grep '^[^@#]' < file.in > file.out
даст вам строки, начинающиеся с любого символа, кроме @
и #
, поэтому эффективно удалите строки #foo
, @foo
, а также пустые строки.
grep -v '^[@#]' < file.in > file.out
сохранит пустые строки. Если вы хотите рассмотреть строки с пробелами перед @
,#
:
grep -v '^[[:blank:]]*[@#]' < file.in > file.out
А также убрать пустые строки:
grep '^[[:blank:]]*[^[:blank:]@#]' < file.in > file.out
Я подозреваю, что это происходит потому, что вы запускаете свою программу с терминала, который не является виртуальной консолью./dev/tty
— специальное устройство, обеспечивающее доступ к управляющему терминалу , и это не обязательно виртуальная консоль; но используемый вами ioctl
работает только на виртуальных консолях.
Ваша программа будет работать надежно, если вы убедитесь, что fd
указывает на виртуальную консоль , и самый простой способ сделать это при запуске от имени пользователя root — открыть /dev/tty0
, что активная виртуальная консоль:
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/vt.h>
int main(int argc, char **argv) {
long tty = -1;
long fd = 0;
int result = 0;
struct vt_stat ttyinfo;
fd = open("/dev/tty0", O_RDWR | O_NOCTTY);
if (fd < 0) {
perror("Error opening /dev/tty0");
return 1;
}
result = ioctl(fd, VT_GETSTATE, &ttyinfo);
if (result == 0) {
tty = ttyinfo.v_active;
printf("Active tty: %ld\n", tty);
} else {
perror("ioctl failed");
}
}