В репозитории находится файл trial.txt со следующим текстом:
Determining Coefficients
Average Tractions
trial 1 xyzt 1.987213
trial 2 xyzt 1.131322
trial 3 xyzt 1.123132
trial for abc 1
1.473248 2.027327
trial for abc 2
2.043960 2.043960
trial for abc 3
2.027327 1.473248
Я пытаюсь найти однострочное выражение с помощью grep и pipe вместе с регулярными выражениями, которое извлечет Только числовые значения для 1-й и 3-й строк после текста trial for abC# из файла. Результат после выполнения команды должен быть:
1.473248 2.027327
2.027327 1.473248
Благодарю, если кто-нибудь может помочь! Спасибо.





Для этого вам не нужны grep или какие-либо конвейерные процессы ...
sed -ne '/trial for abc [0-9]\+/{n;p}' trial.txt
Параметр -n запрещает sed автоматически распечатывать каждую строку, и для каждой строки, соответствующей регулярному выражению, запускаются команды n и p. n считывает следующую строку в пространстве шаблонов sed, а p распечатывает ее.
Спасибо. Но на этот раз, к сожалению, мне пришлось сделать это с помощью grep.
Пожалуйста, избегайте ответов "Дай мне код". Также см. Сколько исследовательских усилий ожидается от пользователей Stack Overflow?
Это работает для меня
➜ /tmp cat trial.txt | grep "^[ .0-9]*$"
1.473248 2.027327
2.043960 2.043960
2.027327 1.473248
"^" marks the beginning of the line.
"[ .0-9]*" allows only spaces, periods and digits.
"$" marks the end of the line.
Это выражение НЕ идеально и в целом принимает множество других строк, но является самым простым, отклоняющим все нежелательные строки в текстовом файле.
Другая версия, которая отклоняет все строки, содержащие любой алфавит
➜ /tmp grep -v "[[:alpha:]]" trial.txt
1.473248 2.027327
2.043960 2.043960
2.027327 1.473248
не гарантирует, что строка с цифрами находится после trial for abc
@PhilippGrigoryev Согласен. Это то, что будет работать ТОЛЬКО для этой конкретной файловой структуры при условии, что остальная часть файла похожа.
что, если мне нужны только первая и третья строки, как мне изменить строку?
@SercanGul Какой узор вы ищете?
Я пытаюсь распечатать только числа в строке, в которой одна константа меньше 2. Например, числа в первой и третьей строках.
Вы готовы использовать awk?
Вы можете перенаправить вывод любого из вышеуказанных grep в grep "[0-1]\.", предполагая, что нет чисел -ve.
на самом деле это звучит хорошо. большое спасибо!
grep -A1 "sifs for crack" "sifs.txt" | grep -v "sifs для крэка" | grep -v "2.043960"
Это работает для меня, используя только grep и трубы, как вы просили:
grep -A1 "trial for" "trial.txt" | grep -v "trial for"
Что он делает, так это ищет слова «испытание для» и печатает строку после этого, а затем перенаправляет ее на другой grep, который удаляет строки, содержащие «испытание для» печати только правильных сумм / чисел.
Пожалуйста, избегайте ответов "Дай мне код". Также см. Сколько исследовательских усилий ожидается от пользователей Stack Overflow?
Спасибо! Позже я понял, что этот пост был для какого-то теста, как раз тогда, когда OP много раз менял основной вопрос
grep -A 1 'trial for abc' /tmp/1 | grep '^[0-9. ]+$'
работает для меня, где -A 1 должен печатать 1 строку после строки привязки, а следующий grep - выбрать строку с числами из результата
Пожалуйста, избегайте ответов "Дай мне код". Также см. Сколько исследовательских усилий ожидается от пользователей Stack Overflow?
Пожалуйста, избегайте вопросов "Дай мне код". Вместо этого покажите сценарий, над которым вы работаете, и укажите, в чем проблема. Также см. Сколько исследовательских усилий ожидается от пользователей Stack Overflow?