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

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

pattern1 pattern2 

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

  • Sed заменить алфавит на верхний регистр после периода
  • Печать текста между двумя шаблонами, не содержащими конкретного слова
  • Подсчет последовательных повторений определенного символа (например,)
  • Дублирование каждой строки при изменении значения в каждой копии строки по-разному в Linux
  • Как добиться переносимости с помощью sed -i (редактирование на месте)?
  • Обработка переменных sed с помощью путей в них?
  • Как удалить первые 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/$/ /' 
    Linux и Unix - лучшая ОС в мире.