sed или grep или awk, чтобы соответствовать очень очень длинным строкам - PullRequest
0 голосов
/ 31 мая 2010

больше файлов

param1=" 1,deerfntjefnerjfntrjgntrjnvgrvgrtbvggfrjbntr*rfr4fv*frfftrjgtrignmtignmtyightygjn      2,3,4,5,6,7,8, 
rfcmckmfdkckemdio8u548384omxc,mor0ckofcmineucfhcbdjcnedjcnywedpeodl40fcrcmkedmrikmckffmcrffmrfrifmtrifmrifvysdfn drfr4fdr4fmedmifmitfmifrtfrfrfrfnurfnurnfrunfrufnrufnrufnrufnruf"****

должно соответствовать содержанию param1 как

sed -n "/$param1/p" file 

но из-за длины строки (очень длинной строки) я не могу соответствовать строке Как лучше сочетать очень длинные строки?

Ответы [ 2 ]

1 голос
/ 31 мая 2010

Может быть проблема в том, что ваш $param1 содержит специальные символы? Это работает для меня:

A="$(perl -e 'print "a" x 10000')"
echo $A | sed -n "/$A/p"

($A содержит 10 000 a символов).

echo $A | grep -F $A

и

echo $A | grep -P $A

также работает (для второго требуется grep со встроенной поддержкой PCRE. Если вы хотите сопоставить с шаблоном, вы должны использовать это или pcregrep. Если вы не используете, используйте фиксированный grep (grep -F)).

echo $A | grep $A

слишком медленно.

1 голос
/ 31 мая 2010

Проблема, с которой вы сталкиваетесь, состоит в том, что param1 содержит специальные символы, которые интерпретируются sed. Звездочка ('*') используется для обозначения «ноль или более вхождений предыдущего символа», поэтому, когда этот символ интерпретируется с помощью sed, не остается ничего, что соответствовало бы буквальной звездочке, которую вы ищете.

Ниже приведен рабочий скрипт bash, который должен помочь:

#!/bin/bash

param1=' 1,deerfntjefnerjfntrjgntrjnvgrvgrtbvggfrjbntr\*rfr4fv\*frfftrjgtrignmtignmtyightygjn 2,3,4,5,6,7,8, rfcmckmfdkckemdio8u548384omxc,mor0ckofcmineucfhcbdjcnedjcnywedpeodl40fcrcmkedmrikmckffmcrffmrfrifmtrifmrifvysdfn'

cat <<EOF | sed "s/${param1}/Bubba/g"
 1,deerfntjefnerjfntrjgntrjnvgrvgrtbvggfrjbntr*rfr4fv*frfftrjgtrignmtignmtyightygjn 2,3,4,5,6,7,8, rfcmckmfdkckemdio8u548384omxc,mor0ckofcmineucfhcbdjcnedjcnywedpeodl40fcrcmkedmrikmckffmcrffmrfrifmtrifmrifvysdfn    
EOF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...