Печатать слово, содержащее строку и первое слово

Если вы в отчаянии, вы можете загрузиться с диска Ubuntu, который вы изначально использовали, а затем следуйте этому руководству, чтобы установить восстановление загрузки в своем Live Ubuntu, сбегая с диска.

Как только вы это сделаете, Я уверен, что он снова установит Grub и предоставит вам возможность загрузки с вашего раздела Windows. После того, как вы закончите описанное выше руководство, вы должны иметь загрузочную установку Windows, хотя и с страницей Grub, которая появляется в начале загрузки, как и в Ubuntu.

По крайней мере, это поможет вам , и нет проблемы с запуском Grub только с Windows.

1
задан 21 October 2016 в 02:07

6 ответов

Перл для спасения!

#!/usr/bin/perl
use warnings;
use strict;

my $file = shift;
my $regex = join '|', map quotemeta, @ARGV;
$regex = qr/\b($regex)\b/;

open my $IN, '<', $file or die "$file: $!";
while (<$IN>) {
    if (my ($match) = /$regex/) {
        print my ($first) = /^\S+/g;
        if ($match ne $first) {
            print "\t$match";
        }
        print "\n";
    }
}

Сохранить как first-plus-word, запуститься как

perl first-plus-word file.txt text thing try Better

Он создает регулярное выражение из входных слов. Каждая строка затем сопоставляется с регулярным выражением, и если есть совпадение, первое слово печатается, и если оно отличается от слова, это слово также печатается.

9
ответ дан 23 May 2018 в 07:05

Вот версия awk:

awk '
  NR==FNR {a[$0]++; next;} 
  {
    gsub(/"/,"",$0);
    for (i=1; i<=NF; i++)
      if ($i in a) printf "%s\n", i==1? $i : $1"\t"$i;
  }
  ' file2 file1

, где file2 - список слов, а file1 содержит фразы.

9
ответ дан 23 May 2018 в 07:05

Вот версия python:

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

# List of strings that you want
# to search in the file. Change it
# as you fit necessary. Remember commas
strings = [
          'text', 'thing',
          'try', 'Better'
          ]


with open(sys.argv[1]) as input_file:
    for line in input_file:
        for string in strings:
            if string in line:
               words = line.strip().split()
               print(words[0],end="")
               if len(words) > 1:
                   print("\t",string)
               else:
                   print("")

Демонстрация:

$> cat input_file.txt                                                          
This is a single text line
Another thing
It is better you try again
Better
$> python ./initial_word.py input_file.txt                                      
This    text
Another     thing
It  try
Better

Боковое примечание: сценарий совместим python3, поэтому вы можете запускать его с помощью python2 или python3.

8
ответ дан 23 May 2018 в 07:05

Попробуйте это:

$ sed -En 's/(([[:alnum:]]+)[[:space:]].*)?(text|thing|try|Better).*/\2\t\3/p' File
This    text
Another thing
It      try
        Better

Если вкладка перед Better является проблемой, попробуйте это:

$ sed -En 's/(([[:alnum:]]+)[[:space:]].*)?(text|thing|try|Better).*/\2\t\3/; ta; b; :a; s/^\t//; p' File
This    text
Another thing
It      try
Better

Вышеописанное было протестировано на GNU sed ( gsed на OSX). Для BSD sed могут потребоваться некоторые незначительные изменения.

Как это работает

s/(([[:alnum:]]+)[[:space:]].*)?(text|thing|try|Better).*/\2\t\3/ Это ищет слово, [[:alnum:]]+, за которым следует пробел, [[:space:]], за которым следует что-либо, .*, за которым следует одно из ваших слов, text|thing|try|Better, за которым следует что-либо. Если это найдено, оно заменяется первым словом в строке (если есть), вкладкой и совпадающим словом. ta; b; :a; s/^\t//; p Если команда подстановки привела к замене, что означает, что одно из ваших слов было найдено в строке, тогда команда ta сообщает sed перейти к метке a. Если нет, то мы введем (b) в следующую строку. :a определяет метку a. Итак, если одно из ваших слов было найдено, мы (а) выполним подстановку s/^\t//, которая удаляет ведущую вкладку, если она есть, и (b) печатает (p) строку.
7
ответ дан 23 May 2018 в 07:05

Простой подход bash / sed:

$ while read w; do sed -nE "s/\"(\S*).*$w.*/\1\t$w/p" file; done < words 
This    text
Another thing
It  try
    Better

while read w; do ...; done < words будет перебирать каждую строку в файле words и сохранять ее как $w. [F5] заставляет sed ничего не печатать по умолчанию. Затем команда sed заменит двойные кавычки, за которыми следуют не-пробелы (\"(\S*), скобки служат для «захвата» того, что соответствует \S*, первое слово, и мы можем позже ссылаться на него как \1), 0 или более символов (.*), а затем искомое слово ($w) и 0 или более символов (.*). Если это соответствует, мы заменяем его только 1-м словом, вкладкой и $w (\1\t$w) и печатаем строку (это то, что делает p в s///p).

7
ответ дан 23 May 2018 в 07:05

Это версия Ruby

str_list = ['text', 'thing', 'try', 'Better']

File.open(ARGV[0]) do |f|
  lines = f.readlines
  lines.each_with_index do |l, idx|
    if l.match(str_list[idx])
      l = l.split(' ')
      if l.length == 1
        puts l[0]
      else
        puts l[0] + "\t" + str_list[idx]
      end
    end
  end
end

В образце текстового файла hello.txt содержится

This is a single text line
Another thing
It is better you try again
Better

Запуск с ruby source.rb hello.txt приводит к

This    text
Another thing
It      try
Better
5
ответ дан 23 May 2018 в 07:05

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

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