Как я могу «объединить» шаблоны в одной строке?

Я делаю grep и sed, и я получаю две строки файла, которые меня интересуют. Как я могу получить эти строки в одной строке, заканчивающейся новым символом строки?
Теперь я получаю:

pattern1 pattern2 

Я хотел бы получить pattern1 pattern2 \n

7 Solutions collect form web for “Как я могу «объединить» шаблоны в одной строке?”

paste :

 {...pipeline...} | paste -d " " - - 

Это говорит: «прочитайте строку из stdin (первая), прочитайте еще одну строку из stdin (вторая - ), затем присоедините их к пробелу"


баш-специфический метод:

 $ x=$(grep -o pattern. test.txt) $ echo "$x" pattern1 pattern2 $ mapfile -t <<< "$x" $ echo "${MAPFILE[*]}" pattern1 pattern2 

ref: http://www.gnu.org/software/bash/manual/bashref.html#index-mapfile

Я поставлю три версии разных методов подряд

AWK

 printf %s\\n pattern1 pattern2 | awk -vRS="\n" -vORS=" " '1; END {print RS}' 

SED

 printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /' 

TR

 printf %s\\n pattern1 pattern2 | tr '\n' ' '; echo 

И их еще много.

вы можете сделать это с помощью сценария оболочки или в командной строке, просто поместите вывод команды в переменную, а затем echo :

 # x=$(grep -e "pattern1\|pattern2" test) # printf '%s\n' "$x" pattern1 pattern2 

С помощью sed вы можете сделать это:

 <your previous commands> | sed '{N; s/\n/ /}' 
  • N; говорит sed добавить следующую строку в пространство шаблонов, так что теперь sed работает с обеими линиями.
  • s/\n/ / заменяет символ новой строки пробелом, «объединяя» две строки вместе.

Простой способ вывода трубы на xargs :

 $ echo -e 'a\nb' | xargs ab 

Это работает только с небольшим выводом, потому что оно ограничено максимальными символами в командной строке. Наибольшее значение зависит от системы, вы можете получить это значение, используя getconf ARG_MAX .

 ( set -f; IFS=' '; printf '%s %s\n' $(grepcmd <input) ) >output 

IFS будет рад съесть его, если хотите.

заверните sed / grep в backticks

когда ваша оригинальная команда:

 grep -i 'foo' mylog.log | sed 's/bar/baz/gi' 

ваша новая команда:

 `grep -i 'foo' mylog.log | sed 's/bar/baz/gi'` 

Не получает пробелов между строками, но вы всегда можете зацепиться за другую седло:

  | sed 's/$/ /' 
  • замените строку строки 6 после сопоставления строки
  • Добавить текст между несколькими строками с sed, если предыдущая строка не соответствует шаблону
  • Дублируйте и замените шаблон в текстовом файле
  • Замените пробелы в начале строки на "-"
  • Замена пустого пространства без нуля
  • Печатать строки файла между двумя шаблонами соответствия
  • Сравните два файла и напечатайте только первое слово строк, которые не совпадают со строкой
  • Указание параметров командной строки, разделенных запятыми, на основе строк текстовых файлов
  • Использование cut / awk / sed с двумя разными разделителями
  • Объедините два файла по очереди с символом тройного канала разделителя «|||»
  • Печатать слово, которое не содержит символа
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.