Извлечь один элемент из строк текстового файла

С awk, который имеет переменную FILENAME, автоматически устанавливается на имя файла (и, если GNU awk, с изменениями на месте):

$ for i in {20..26}; do printf "%s\n" "datafname = example.nex" "ofprefix = best.example" > $i.conf; done
$ gawk -i inplace 'FNR == 1 {split(FILENAME, file, ".")} {gsub("example", file[1])} 1' *.conf
$ cat 25.conf
datafname = 25.nex
ofprefix = best.25
FNR == 1 {split(FILENAME, file, ".")}: на первой строки каждого файла, разделите имя файла на . и сохраните его в массиве file {gsub("example", file[1])} 1: для всех строк замените example на первый элемент массива file и распечатайте.
4
задан 26 March 2018 в 19:34

18 ответов

С awk способом:

awk -F'*\\*' 'NF>2{print $2}' infile

пример тестового ввода:

*wrd*
*woooord
**WRD
WORD**
woooooooooood*
**word**

выход:

word
3
ответ дан 22 May 2018 в 11:46

С awk способом:

awk -F'*\\*' 'NF>2{print $2}' infile

пример тестового ввода:

*wrd* *woooord **WRD WORD** woooooooooood* **word**

выход:

word
3
ответ дан 17 July 2018 в 18:03

С awk способом:

awk -F'*\\*' 'NF>2{print $2}' infile

пример тестового ввода:

*wrd* *woooord **WRD WORD** woooooooooood* **word**

выход:

word
3
ответ дан 23 July 2018 в 18:54

Подобно этому для слова, используя perl regex (-P):

grep -oP '^\s*\*\*\K[^*]+(?=\*\*)' file

Выход:

word

Как это для слов:

Выход:

Definition
Usage
Others
8
ответ дан 22 May 2018 в 11:46

Есть несколько доступных инструментов, которые можно использовать для извлечения слова, вот версия, реализованная в sed:

 sed '/^\*\*/!d' <your_file

Эта команда будет соответствовать каждой строке в вашем файле, которая начинается с ** и печати Это. Остальные строки будут удалены из вывода. Если вы также хотите удалить звезды, вы можете расширить эту команду:

sed '/^\*\*/!d;s/\*//g' <your_file

Эта команда, кроме того, удалит все * символы из строки до ее печати. ​​[!d2 ]

5
ответ дан 22 May 2018 в 11:46
  • 1
    Привет, Себастьян Старк, есть ли причина использовать перенаправление < вместо имени файла? Или это опечатка, где вы хотели написать <your_file>? – pa4080 26 March 2018 в 19:55
  • 2
    @ pa4080 это нормально, и другие утилиты обработки текста, такие как tr, требуют этого – Zanna 26 March 2018 в 19:59
  • 3
    @ Занна, хорошо, но будем ли мы использовать некоторые преимущества или недостатки этого использования в этом случае? Например, опция -i не будет работать, я думаю. – pa4080 26 March 2018 в 20:03
  • 4
    @ pa4080 это привычка, нет особых причин – Sebastian Stark 27 March 2018 в 02:55

Это один из тех вопросов, где полезно иметь тестовый входной файл и примеры желаемого вывода.

Входной файл

Вот тестовый входной файл, который я скопировал из Интернет и модифицирован для помещения поисковых слов в пары **:

$ cat ~/Downloads/wordlist.txt
**Schadenfreude**
This is a German word, although used in English too, which is used to mean ‘malicious enjoyment of the misfortunes of others’. It comes from the joining of the words schaden meaning ‘harm’ and freude meaning ‘joy’.

**Waldeinsamkeit**
Ever found yourself wandering alone through a forest and wanting to express the emotion brought about by that wander? Look no further! In German, Waldeinsamkeit means ‘woodland solitude’.

**L’esprit de l’escalier**
We all know the feeling of walking away from an argument and instantly thinking of the ideal comeback, or leaving a conversation and remembering the perfect contribution to a no-longer relevant subject. In French, l’esprit de l’escalier is the term used to refer to that irritating feeling. It literally translates as ‘the spirit of the staircase’, more commonly known as ‘staircase wit’. It comes from the idea of thinking of a response as you’re leaving somebody’s house, via their staircase.

**Schlimazel**
The Mr Men series of books by Roger Hargreaves is a staple of many a British child’s bookshelves, and there is a word which could have been created for the character Mr Bump. Like Mr Bump, a Schlimazel is ‘a consistently unlucky, accident-prone person, a born loser’. It is a Yiddish word, coming from the Middle High German word slim meaning ‘crooked’ and the Hebrew mazzāl meaning ‘luck’.

**Depaysement**
Ever go on holiday, only to experience a strange sensation of disorientation at the change of scenery? Dépaysement is a French word which refers to that feeling of disorientation that specifically arises when you are not in your home country.

**Duende**
This Spanish term implies something magical or enchanting. It originally referred to a supernatural being or spirit  similar to an imp or pixie (and is occasionally borrowed in that sense into English with reference to Spanish and Latin American folklore). Now, it has adapted to refer to the spirit of art or the power that a song or piece of art has to deeply move a person.

**Torschlusspanik**
Are you getting older? Scared of being left behind or ‘left on the shelf’? This British idiom has its own word in German: Torschlusspanik, which literally translates as ‘panic at the shutting of a gate’, is used frequently in a general sense meaning ‘last –minute panic’, of the type you might experience before a deadline.

*Do*Not*Return*these four star lines
*word***
***word*
word**

Использование grep

Используя grep, довольно просто получить список слов: [!d4 ]

$ grep -E -o '\*\*[^*]{,20}\*\*' ~/Downloads/wordlist.txt
**Schadenfreude**
**Waldeinsamkeit**
**L’esprit de l’escalier**
**Schlimazel**
**Depaysement**
**Duende**
**Torschlusspanik**

Если вы хотите удалить **, обменивая слова, добавьте канал в sed:

$ grep -E -o '\*\*[^*]{,20}\*\*' ~/Downloads/wordlist.txt | sed 's/*//g'
Schadenfreude
Waldeinsamkeit
L’esprit de l’escalier
Schlimazel
Depaysement
Duende
Torschlusspanik

Сохранение индекса слов в файл

7] Если вы хотите сохранить выходные данные grep и sed, используйте команду переназначения файла >:

$ grep -E -o '\*\*[^*]{,20}\*\*' ~/Downloads/wordlist.txt | sed 's/*//g' > ~/Downloads/wordlist-index.txt

$ cat ~/Downloads/wordlist-index.txt
Schadenfreude
Waldeinsamkeit
L’esprit de l’escalier
Schlimazel
Depaysement
Duende
Torschlusspanik

Примечание. Первоначальный ответ опубликован вчера с новым сообщением сегодня от muru на отдельном Q & amp; A: Использовать указанный квантификатор в grep для получения удовлетворенного словаря

3
ответ дан 22 May 2018 в 11:46

Если вы не возражаете использовать дополнительные инструменты, очень простым решением было бы постфильтрацию выхода grep с помощью tr, чтобы удалить все вхождения символа *:

grep -x '\*\*[^*]*\*\*' | tr -d '*'
1] Я также рекомендую использовать флаг -x для GNU grep, как указано выше, чтобы соответствовать целым строкам, чтобы случайно не поймать **word**, окруженный другим текстом в той же строке. Это может также ускорить процесс сопоставления шаблонов, так как теперь он может отказаться от многих потенциальных совпадений на раннем этапе.

sed alternative

Вы также можете использовать флаг sed p для сопоставить, заменить и распечатать как одну команду:

sed -nre 's/^\*\*([^*]*)\*\*$/\1/p'
2
ответ дан 22 May 2018 в 11:46

GNU grep

Ваш конкретный случай - извлечение текста между двумя шаблонами в строке / строке. Это было рассмотрено в вопросе 2012 года. Как использовать sed / grep для извлечения текста между двумя словами ?. В частности, как упоминалось в анишане, вы можете использовать обратные и обратные шаблоны с флагом Perl-regex -P. В вашем конкретном случае решение было бы

grep -o -P '(?<=\*\*).*(?=\*\*)' input.txt

Однако, как Как использовать sed / grep для извлечения текста между двумя словами? , -P GNU grep. Имейте это в виду, если вы портируете свои сценарии / команды между разными системами * nix.

Perl

Вместо того, чтобы пытаться использовать регулярное выражение Perl, давайте просто использовать Perl:

$ perl -a -F\\*\\* -lane 'print $F[1] if /\*\*/' input.txt
word

Это имеет два преимущества , Во-первых, он определяет разделитель для «полей», что означает, что мы можем обрабатывать отдельные элементы, разделенные **. Во-вторых, синтаксически это немного немного запутывает, чем обратный / обратный шаблон.

Python

Конечно, есть и другие способы сделать это, и один из них - Python. Сценарий Python 2.7:

#!/usr/bin/env python
from __future__ import print_function
import sys

for f in sys.argv[1:]:
    with open(f) as fd:
        for line in fd:
            if line.startswith('**'):
                 print(line.split('*')[2])

Вы также можете сделать его однострочным и использовать перенаправление stdin:

python -c 'import re,sys; print "\n".join([ l.split("**")[1] for l in sys.stdin if "**" in l  ])' < input.txt

Другие, которые предпочитают регулярное выражение, могут захотеть используйте модуль re.

python -c 'import re,sys; print "\n".join([ re.split("\*\*",l)[1] for l in sys.stdin if "**" in l  ])' < input.txt
1
ответ дан 22 May 2018 в 11:46

Если вы не возражаете использовать дополнительные инструменты, очень простым решением было бы постфильтрацию выхода grep с помощью tr, чтобы удалить все вхождения символа *:

grep -x '\*\*[^*]*\*\*' | tr -d '*'

Я также рекомендую использовать флаг -x для GNU grep, как указано выше, чтобы соответствовать целым строкам, чтобы случайно не поймать **word**, окруженный другим текстом в той же строке. Это может также ускорить процесс сопоставления шаблонов, так как теперь он может отказаться от многих потенциальных совпадений на раннем этапе.

sed alternative

Вы также можете использовать флаг sed p для сопоставить, заменить и распечатать как одну команду:

sed -nre 's/^\*\*([^*]*)\*\*$/\1/p'
2
ответ дан 17 July 2018 в 18:03

Подобно этому для слова, используя perl regex (-P):

grep -oP '^\s*\*\*\K[^*]+(?=\*\*)' file

Выход:

word

Как это для слов:

grep -oP '^\s*\d+\.\s*\K\w+' file

Выход:

Definition Usage Others
8
ответ дан 17 July 2018 в 18:03

Есть несколько доступных инструментов, которые можно использовать для извлечения слова, вот версия, реализованная в sed:

sed '/^\*\*/!d' <your_file

Эта команда будет соответствовать каждой строке в вашем файле, которая начинается с ** и печати Это. Остальные строки будут удалены из вывода. Если вы также хотите удалить звезды, вы можете расширить эту команду:

sed '/^\*\*/!d;s/\*//g' <your_file

Эта команда, кроме того, удалит все * символы из строки до ее печати. ​​

5
ответ дан 17 July 2018 в 18:03

GNU grep

Ваш конкретный случай - извлечение текста между двумя шаблонами в строке / строке. Это было рассмотрено в вопросе 2012 года. Как использовать sed / grep для извлечения текста между двумя словами ?. В частности, как упоминалось в анишане, вы можете использовать обратные и обратные шаблоны с флагом Perl-regex -P. В вашем конкретном случае решение было бы

grep -o -P '(?<=\*\*).*(?=\*\*)' input.txt

Однако, как Как использовать sed / grep для извлечения текста между двумя словами? , -P GNU grep. Имейте это в виду, если вы портируете свои сценарии / команды между разными системами * nix.

Perl

Вместо того, чтобы пытаться использовать регулярное выражение Perl, давайте просто использовать Perl:

$ perl -a -F\\*\\* -lane 'print $F[1] if /\*\*/' input.txt word

Это имеет два преимущества , Во-первых, он определяет разделитель для «полей», что означает, что мы можем обрабатывать отдельные элементы, разделенные **. Во-вторых, синтаксически это немного немного запутывает, чем обратный / обратный шаблон.

Python

Конечно, есть и другие способы сделать это, и один из них - Python. Сценарий Python 2.7:

#!/usr/bin/env python from __future__ import print_function import sys for f in sys.argv[1:]: with open(f) as fd: for line in fd: if line.startswith('**'): print(line.split('*')[2])

Вы также можете сделать его однострочным и использовать перенаправление stdin:

python -c 'import re,sys; print "\n".join([ l.split("**")[1] for l in sys.stdin if "**" in l ])' < input.txt

Другие, которые предпочитают регулярное выражение, могут захотеть используйте модуль re.

python -c 'import re,sys; print "\n".join([ re.split("\*\*",l)[1] for l in sys.stdin if "**" in l ])' < input.txt
1
ответ дан 17 July 2018 в 18:03

Это один из тех вопросов, где полезно иметь тестовый входной файл и примеры желаемого вывода.

Входной файл

Вот тестовый входной файл, который я скопировал из Интернет и модифицирован для помещения поисковых слов в пары **:

$ cat ~/Downloads/wordlist.txt **Schadenfreude** This is a German word, although used in English too, which is used to mean ‘malicious enjoyment of the misfortunes of others’. It comes from the joining of the words schaden meaning ‘harm’ and freude meaning ‘joy’. **Waldeinsamkeit** Ever found yourself wandering alone through a forest and wanting to express the emotion brought about by that wander? Look no further! In German, Waldeinsamkeit means ‘woodland solitude’. **L’esprit de l’escalier** We all know the feeling of walking away from an argument and instantly thinking of the ideal comeback, or leaving a conversation and remembering the perfect contribution to a no-longer relevant subject. In French, l’esprit de l’escalier is the term used to refer to that irritating feeling. It literally translates as ‘the spirit of the staircase’, more commonly known as ‘staircase wit’. It comes from the idea of thinking of a response as you’re leaving somebody’s house, via their staircase. **Schlimazel** The Mr Men series of books by Roger Hargreaves is a staple of many a British child’s bookshelves, and there is a word which could have been created for the character Mr Bump. Like Mr Bump, a Schlimazel is ‘a consistently unlucky, accident-prone person, a born loser’. It is a Yiddish word, coming from the Middle High German word slim meaning ‘crooked’ and the Hebrew mazzāl meaning ‘luck’. **Depaysement** Ever go on holiday, only to experience a strange sensation of disorientation at the change of scenery? Dépaysement is a French word which refers to that feeling of disorientation that specifically arises when you are not in your home country. **Duende** This Spanish term implies something magical or enchanting. It originally referred to a supernatural being or spirit similar to an imp or pixie (and is occasionally borrowed in that sense into English with reference to Spanish and Latin American folklore). Now, it has adapted to refer to the spirit of art or the power that a song or piece of art has to deeply move a person. **Torschlusspanik** Are you getting older? Scared of being left behind or ‘left on the shelf’? This British idiom has its own word in German: Torschlusspanik, which literally translates as ‘panic at the shutting of a gate’, is used frequently in a general sense meaning ‘last –minute panic’, of the type you might experience before a deadline. *Do*Not*Return*these four star lines *word*** ***word* word**

Использование grep

Используя grep, довольно просто получить список слов:

$ grep -E -o '\*\*[^*]{,20}\*\*' ~/Downloads/wordlist.txt **Schadenfreude** **Waldeinsamkeit** **L’esprit de l’escalier** **Schlimazel** **Depaysement** **Duende** **Torschlusspanik**

Если вы хотите удалить **, обменивая слова, добавьте канал в sed:

$ grep -E -o '\*\*[^*]{,20}\*\*' ~/Downloads/wordlist.txt | sed 's/*//g' Schadenfreude Waldeinsamkeit L’esprit de l’escalier Schlimazel Depaysement Duende Torschlusspanik

Сохранение индекса слов в файл

Если вы хотите сохранить выходные данные grep и sed, используйте команду переназначения файла >:

$ grep -E -o '\*\*[^*]{,20}\*\*' ~/Downloads/wordlist.txt | sed 's/*//g' > ~/Downloads/wordlist-index.txt $ cat ~/Downloads/wordlist-index.txt Schadenfreude Waldeinsamkeit L’esprit de l’escalier Schlimazel Depaysement Duende Torschlusspanik

Примечание. Первоначальный ответ опубликован вчера с новым сообщением сегодня от muru на отдельном Q & amp; A: Использовать указанный квантификатор в grep для получения удовлетворенного словаря

3
ответ дан 17 July 2018 в 18:03

Если вы не возражаете использовать дополнительные инструменты, очень простым решением было бы постфильтрацию выхода grep с помощью tr, чтобы удалить все вхождения символа *:

grep -x '\*\*[^*]*\*\*' | tr -d '*'

Я также рекомендую использовать флаг -x для GNU grep, как указано выше, чтобы соответствовать целым строкам, чтобы случайно не поймать **word**, окруженный другим текстом в той же строке. Это может также ускорить процесс сопоставления шаблонов, так как теперь он может отказаться от многих потенциальных совпадений на раннем этапе.

sed alternative

Вы также можете использовать флаг sed p для сопоставить, заменить и распечатать как одну команду:

sed -nre 's/^\*\*([^*]*)\*\*$/\1/p'
2
ответ дан 23 July 2018 в 18:54

Как это для слова, используя perl regex (-P):

grep -oP '^\s*\*\*\K[^*]+(?=\*\*)' file

Выход:

word

Как это для слов:

grep -oP '^\s*\d+\.\s*\K\w+' file

Выход:

Definition Usage Others
8
ответ дан 23 July 2018 в 18:54

Есть несколько доступных инструментов, которые можно использовать для извлечения слова, вот версия, реализованная в sed:

sed '/^\*\*/!d' <your_file

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

sed '/^\*\*/!d;s/\*//g' <your_file

Эта команда, кроме того, удалит все * символы из строки до ее печати. ​​

5
ответ дан 23 July 2018 в 18:54
  • 1
    Привет, Себастьян Старк, есть ли причина использовать перенаправление < вместо имени файла? Или это опечатка, где вы хотели написать <your_file>? – pa4080 26 March 2018 в 19:55
  • 2
    @ pa4080 это нормально, и другие утилиты обработки текста, такие как tr, требуют этого – Zanna 26 March 2018 в 19:59
  • 3
    @ Занна, хорошо, но будем ли мы использовать некоторые преимущества или недостатки этого использования в этом случае? Например, опция -i не будет работать, я думаю. – pa4080 26 March 2018 в 20:03
  • 4
    @ pa4080 это привычка, нет особых причин – Sebastian Stark 27 March 2018 в 02:55

GNU grep

Ваш конкретный случай - извлечение текста между двумя шаблонами в строке / строке. Это было рассмотрено в вопросе 2012 года. Как использовать sed / grep для извлечения текста между двумя словами ?. В частности, как упоминалось в анишане, вы можете использовать обратные и обратные шаблоны с флагом Perl-regex -P. В вашем конкретном случае решение было бы

grep -o -P '(?<=\*\*).*(?=\*\*)' input.txt

Однако, как Как использовать sed / grep для извлечения текста между двумя словами? , -P GNU grep. Имейте это в виду, если вы портируете свои сценарии / команды между разными системами * nix.

Perl

Вместо того, чтобы пытаться использовать регулярное выражение Perl, давайте просто использовать Perl:

$ perl -a -F\\*\\* -lane 'print $F[1] if /\*\*/' input.txt word

Это имеет два преимущества , Во-первых, он определяет разделитель для «полей», что означает, что мы можем обрабатывать отдельные элементы, разделенные **. Во-вторых, синтаксически это немного немного запутывает, чем обратный / обратный шаблон.

Python

Конечно, есть и другие способы сделать это, и один из них - Python. Сценарий Python 2.7:

#!/usr/bin/env python from __future__ import print_function import sys for f in sys.argv[1:]: with open(f) as fd: for line in fd: if line.startswith('**'): print(line.split('*')[2])

Вы также можете сделать его однострочным и использовать перенаправление stdin:

python -c 'import re,sys; print "\n".join([ l.split("**")[1] for l in sys.stdin if "**" in l ])' < input.txt

Другие, которые предпочитают регулярное выражение, могут захотеть используйте модуль re.

python -c 'import re,sys; print "\n".join([ re.split("\*\*",l)[1] for l in sys.stdin if "**" in l ])' < input.txt
1
ответ дан 23 July 2018 в 18:54

Это один из тех вопросов, где полезно иметь тестовый входной файл и примеры желаемого вывода.

Входной файл

Вот тестовый входной файл, который я скопировал из Интернет и модифицирован для помещения поисковых слов в пары **:

$ cat ~/Downloads/wordlist.txt **Schadenfreude** This is a German word, although used in English too, which is used to mean ‘malicious enjoyment of the misfortunes of others’. It comes from the joining of the words schaden meaning ‘harm’ and freude meaning ‘joy’. **Waldeinsamkeit** Ever found yourself wandering alone through a forest and wanting to express the emotion brought about by that wander? Look no further! In German, Waldeinsamkeit means ‘woodland solitude’. **L’esprit de l’escalier** We all know the feeling of walking away from an argument and instantly thinking of the ideal comeback, or leaving a conversation and remembering the perfect contribution to a no-longer relevant subject. In French, l’esprit de l’escalier is the term used to refer to that irritating feeling. It literally translates as ‘the spirit of the staircase’, more commonly known as ‘staircase wit’. It comes from the idea of thinking of a response as you’re leaving somebody’s house, via their staircase. **Schlimazel** The Mr Men series of books by Roger Hargreaves is a staple of many a British child’s bookshelves, and there is a word which could have been created for the character Mr Bump. Like Mr Bump, a Schlimazel is ‘a consistently unlucky, accident-prone person, a born loser’. It is a Yiddish word, coming from the Middle High German word slim meaning ‘crooked’ and the Hebrew mazzāl meaning ‘luck’. **Depaysement** Ever go on holiday, only to experience a strange sensation of disorientation at the change of scenery? Dépaysement is a French word which refers to that feeling of disorientation that specifically arises when you are not in your home country. **Duende** This Spanish term implies something magical or enchanting. It originally referred to a supernatural being or spirit similar to an imp or pixie (and is occasionally borrowed in that sense into English with reference to Spanish and Latin American folklore). Now, it has adapted to refer to the spirit of art or the power that a song or piece of art has to deeply move a person. **Torschlusspanik** Are you getting older? Scared of being left behind or ‘left on the shelf’? This British idiom has its own word in German: Torschlusspanik, which literally translates as ‘panic at the shutting of a gate’, is used frequently in a general sense meaning ‘last –minute panic’, of the type you might experience before a deadline. *Do*Not*Return*these four star lines *word*** ***word* word**

Использование grep

Используя grep, довольно просто получить список слов:

$ grep -E -o '\*\*[^*]{,20}\*\*' ~/Downloads/wordlist.txt **Schadenfreude** **Waldeinsamkeit** **L’esprit de l’escalier** **Schlimazel** **Depaysement** **Duende** **Torschlusspanik**

Если вы хотите удалить **, обменивая слова, добавьте канал в sed:

$ grep -E -o '\*\*[^*]{,20}\*\*' ~/Downloads/wordlist.txt | sed 's/*//g' Schadenfreude Waldeinsamkeit L’esprit de l’escalier Schlimazel Depaysement Duende Torschlusspanik

Сохранение индекса слов в файл

Если вы хотите сохранить выходные данные grep и sed, используйте команду переназначения файла >:

$ grep -E -o '\*\*[^*]{,20}\*\*' ~/Downloads/wordlist.txt | sed 's/*//g' > ~/Downloads/wordlist-index.txt $ cat ~/Downloads/wordlist-index.txt Schadenfreude Waldeinsamkeit L’esprit de l’escalier Schlimazel Depaysement Duende Torschlusspanik

Примечание. Первоначальный ответ опубликован вчера с новым сообщением сегодня от muru на отдельном Q & amp; A: Использовать указанный квантификатор в grep для получения удовлетворенного словаря

3
ответ дан 23 July 2018 в 18:54

Другие вопросы по тегам:

Похожие вопросы: