Общий совет по поводу xargs: не используйте xargs
. Его входной формат не поддерживается ни одним распространенным инструментом.
Следующий уровень использования xargs — использовать xargs -0
с входными данными, разделенными нулем. Но в вашем случае xargs все равно бессмысленно.
Если вы хотите получить список файлов в каталоге, вы можете использовать ls
. Чтобы убедиться, что в каждой строке будет один файл, используйте ls -1
. Команда ls
всегда помещает один файл в строку, когда ее вывод идет в канал или в файл. Когда вывод является терминалом, простой ls
выравнивает имена файлов в столбцах, а ls -1
— нет.
Если у вас есть список слов и вы хотите напечатать их по одному в строке, вы можете использовать printf '%s\n'
. Это работает аналогично echo
, за исключением того, что после каждого элемента печатается разрыв строки вместо пробела, и нет опасности обработки обратной косой черты или начального тире.
printf '%s\n' * # prints the names of the files in the current directory
printf '%s\n' "$@" # prints the positional arguments
printf '%s\n' "${a[@]}" # prints the element of the array `a`
grep
не использует глобусы; он использует регулярные выражения . Следовательно, попробуйте что-нибудь вроде:
$ disp_x=$(grep '..\...\..._..\...' myfile.txt)
$ echo "$disp_x"
29.04.16_09.35
04.05.16_15.01
В глобусе ?
означает любой символ. Напротив, в регулярных выражениях ?
означает ноль или перемещение предыдущего символа. Чтобы получить любой символ в регулярном выражении, используйте .
. Чтобы получить буквальную точку в регулярном выражении, избегайте ее: \.
.
Или, чтобы требовать числа:
$ disp_x=$(grep -E '[[:digit:].]{8}_[[:digit:].]{5}' myfile.txt)
$ echo "$disp_x"
29.04.16_09.35
04.05.16_15.01
[: digit:]
соответствует любая цифра. В отличие от [0-9]
, он безопасен для юникода.
Вы можете grep
файл, используя регулярное выражение:
grep -xE '([0-9]{2}[._]*)*' filename
[0-9] {2}
для сопоставления двух цифр, [._] *
для сопоставления этих символов, встречающихся в любое время, и все выражение в круглых скобках + *
для сопоставить все это любое количество раз.
Вы можете использовать egrep
также
egrep '[0-9][0-9].[0-9][0-9].[0-9][0-9]_[0-9][0-9].[0-9][0-9]' filename
В скрипте
#!/bin/bash
disp_x=$(egrep '[0-9][0-9].[0-9][0-9].[0-9][0-9]_[0-9][0-9].[0-9][0-9]' filename)
echo "$disp_x"