Печать все «специфические» строки в txt-файле с использованием сценария bash

Общий совет по поводу 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`
1
11.05.2016, 01:23
3 ответа

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] , он безопасен для юникода.

0
28.01.2020, 01:19

Вы можете grep файл, используя регулярное выражение:

grep -xE '([0-9]{2}[._]*)*' filename

[0-9] {2} для сопоставления двух цифр, [._] * для сопоставления этих символов, встречающихся в любое время, и все выражение в круглых скобках + * для сопоставить все это любое количество раз.

0
28.01.2020, 01:19

Вы можете использовать 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"
0
28.01.2020, 01:19

Теги

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