2012-06-30 4 views
3

Я пытаюсь использовать awk match() и substr для печати всего, прежде чем произойдет совпадение. Я использую AWK в Баш скрипт, чтобы вытащить строку из имени файла, и попытался следующие:Как распечатать все перед матчем?

awk 'match($0,".S") {print substr($0, RSTART+1, 3)}' 

Это дает мне 3 символов, S плюс 2 после него.

Но я хочу напечатать все перед матчем.

Как я могу это сделать?

+2

Обнаружено. awk -F "[. S]" – user1492268

ответ

1

Это должно сработать для вас.

awk '{i = index($0, ".S"); if (i>0) print substr($0, 0, i+5)}' 
0

Я предпочел бы использовать:

sed 's/.S.*//' 
+0

Это не дает результат, который ищет OP. –

+0

AFAIU OP хочет имя файла, за которым следует некоторый символ и капитал S, например. 'echo filename: S: othertext: morecapital.S | sed 's/.S. * //' 'извлекает имя файла. – Thor

+0

Я интерпретирую, что он хочет включить символ (или буквальную точку) и «S» и следующие два символа, а также начальную строку. Ключевое слово в вопросе для меня - «также». –

3

Только незначительная перестановка:

awk 'match($0, "\.S") {print substr($0, 1, RSTART + 3)}' 

Это говорит AWK для печати, начиная с первого символа через "S" и следующие два персонажи.

Чтобы получить тот же результат с sed:

Простой вариант («.S» может появиться только один раз:

sed 's/\(.*\.S..\).*/\1/' 

Если «.S» может появиться более чем один раз, эта версия дает такой же результат, как версия AWK (только первый «.S» и два его следующие символы сохраняются):

sed 's/\.S../&\n/; s/\n.*//' 

Edit:

perl -nle 'print "$`$&" if /\.S../' 
Смежные вопросы