Как вставить текст в построчном текстовом фильтре, как awk, без ввода stdin echo на экран? - PullRequest
2 голосов
/ 06 февраля 2010

У меня в окне электронной почты есть текстовое окно, которое выглядит примерно так:

100 some random text
101 some more random text
102 lots of random text, all different
103 lots of random text, all the same

Я хочу извлечь числа, то есть первое слово в каждой строке. У меня на терминале Linux открыт терминал bash ...

Если бы они были в текстовом файле, я бы сделал это:

awk '{print $1}' mytextfile.txt

Я бы хотел вставить их и вывести свои номера без создания временного файла.

моя наивная первая попытка выглядела так:

$ awk '{print $1}'
100 some random text
100
101 some more random text
101
102 lots of random text, all different
103 lots of random text, all the same

102
103

Буферизация stdin и stdout делает это хешем. Я не возражал бы, если бы стандартный вывод печатался первым, а затем - стандартным выводом; это то, что произошло бы, если бы я вставил, например, в «sort», но awk и sed - это отдельная история.

немного больше мыслей дало мне это: открыть два терминала. Создайте файл fifo. Читайте с fifo на одном терминале, пишите на другом.

Это действительно работает, но я ленивый. Я не хочу открывать второй терминал. Есть ли способ в оболочке, чтобы я мог скрыть текст, отображаемый на экране, когда я передаю его в канал, чтобы я вставил это:

100 some random text
101 some more random text
102 lots of random text, all different
103 lots of random text, all the same

но видите это?

$ awk '{print $1}'
100
101
102
103

Ответы [ 4 ]

2 голосов
/ 06 февраля 2010

Возможно, лучший способ - использовать вашу оболочку здесь-документы:

awk '{print $1}' <<EOF
100 some random text
101 some more random text
102 lots of random text, all different
103 lots of random text, all the same
EOF
100
101
102
103

В качестве альтернативы, вы можете использовать блок END:

awk '{a[NR]=$1} END{for (i=1;i<=NR;i++) print a[i]}'
100 some random text
101 some more random text
102 lots of random text, all different
103 lots of random text, all the same
^d
100
101
102
103
2 голосов
/ 06 февраля 2010

Вы можете использовать здесь документ . Я попробовал следующее, и это сработало:

$ awk '{print $1}' << END
> 100 some random text
> 101 some more random text
> 102 lots of random text, all different
> 103 lots of random text, all the same
> END
100
101
102
103

Я попытаюсь объяснить, что я набрал:

awk '{print $1}' << END (RETURN)
(PASTE) (RETURN)
END (RETURN)

Если это имеет смысл.

Вставленный текст по-прежнему отображается на стандартном выводе, но результаты, которые вас интересуют, в конечном итоге заканчиваются, так что вы можете легко получить его. Убедитесь, что вы выбрали что-то, чего нет в вашем тексте, чтобы заменить END в моем примере!

1 голос
/ 06 февраля 2010

Если вы настроены, как я, работаете под Windows, Xming и PuTTY, вы можете сделать это:

$ xclip -i[enter]
[right-click-paste]
[ctrl-d]
$ xclip -o | awk '{print $1}'

Требуется, чтобы у вас была настроена X-forwarding, и вы установили xclip (вместо этого можно использовать xsel -i и xsel -o).

1 голос
/ 06 февраля 2010

Что-то вроде

stty -echo ; awk '{print $1}' ; stty echo

может вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...