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

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

pattern1 pattern2 

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

  • Регулярное выражение с sed
  • Разделить файл на две строки перед шаблоном
  • Добавление строки текста в несколько файлов
  • Как проверить, отсутствует ли какой-либо повторяющийся текст в текстовом файле?
  • Различия между sed #,%, / и |
  • Оценить часть текстовой строки
  • Обмен одной колонки из файла1 с файлами из файла2
  • awk, вырезать символы из подстроки
  • 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 - лучшая ОС в мире.