Проблема заключается в \d
, который не понимается sed
regex, поэтому вы должны использовать класс символов цифр: [0-9]
. Кроме того, скобки sed
для этого использования требуют предшествующих обратных слешей. Вместо:
.*\/\d{10}\..*
попробуйте
.*\/[0-9]\{10\}\..*
Если вместо этого указать -regextype posix-egrep
, то получится:
.*\/[0-9]{10}\..*
Существует множество различных версий регулярных выражений. Я бы посоветовал вам найти документацию по команде, которую вы используете, чтобы найти правильный синтаксис regex.
С сайта regxr.com:
RegExr использует механизм RegExp вашего браузера для подбора, а его подсветка синтаксиса и документация отражают стандарт JavaScript RegExp.
Что отчасти объясняет, почему regex не работает с find.
Если вы хотите вывести всегда последнее поле в файле, попробуйте следующее
awk '{if ($NF ~ /SHM/) {print $NF}}' _input_file_
Поскольку в первом столбце данных вашего примера нет записей, начинающихся со строки #2 и далее, вам придется анализировать его как столбцы fixed-width
. Вы можете сделать это:
$awk 'BEGIN {FIELDWIDTHS = "16 40"} /SHM/ { print $2}'
ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07
Если у вас есть GNU grep,
grep -Eo '[[:alnum:]_]*SHM[[:alnum:]_]*' < filename.txt
Если нет, вы можете попросить awk перебирать поля каждой строки в поисках SHM:
awk '{ for(i=1;i<=NF;i++) if ($i ~ /SHM/) print $i }' < filename.txt
awk 'NR==1 {print $2}' filename && awk 'NR>1' filename | sed 's/[[:space:]]*//g'
Выход:
ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07
Это печатает второй столбец в первой строке, следующие строки, а затем удаляет пробелы, чтобы исправить форматирование и вернуть желаемый результат.
Вы можете сделать это следующим образом, используяPerl
:
perl -lne 'print for /\w*SHM\w*/g' input-file.txt
perl -lane 'print for grep /SHM/, @F' input-file.txt # assuming SHM fields r alphanumeric
Или с помощью sed
редактора, POSIX-совместимого способа, предполагая, что все строки имеют по крайней мере один SHM
sed -ne '
s/[[:alnum:]_]*SHM[[:alnum:]_]*/\
&\
/;s/.*\n\(.*\n\)/\1/;P;/\n$/!D
' input.txt
Выход:
ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
awk '{head=substr ($0,1,16 );mypat=substr ($0,17,23 );if (mypat ~/SHM/ ). {print mypat}}' имя файла