Можно ли сопоставить несколько конкретных номеров строк (не диапазон) с sed?

Рассматривать:

echo -e "a\nb\nc\nd\ne\nf\ng\nh" | sed '3,5a test' 

Это будет соответствовать строкам 3, 4 и 5.

Но я пытаюсь сопоставить только строки 3 и 5 (не 4). И добавьте «тест» после них.

3 Solutions collect form web for “Можно ли сопоставить несколько конкретных номеров строк (не диапазон) с sed?”

 echo ... | sed -e '3a test' -e '5a test' 

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

 sed 'b pattern; : action; a \ lalala b end; : pattern; 3b action; 5b action; : end' 

Т.е. вы ставите все команды, которые вам нужны между b pattern; и b end; ,

И вы добавляете все ваши шаблоны (номера строк или что-то еще) после : pattern; ,

Что происходит, так это:

  1. Первая команда перескакивает над частью действия (возможно, ее легче читать, если шаблоны находятся в начале и b end; непосредственно перед частью действия).

  2. Если шаблон совпадает, то выполнение переходит к части действия. После выполнения действия часть выполнения переходит к завершению.

Я стараюсь убрать это:

 sed '3b action; 5b action; b end; : action; a \ lalala : end' 

В одной строке было бы:

 sed "3b idAction; 5b idAction; b; : idAction; a test" 

В переносном смысле вам нужно написать:

 sed ' 3b action 5b action b : action a\ lalala' 

( b без ветвей ярлыков до конца, так что вам не нужна явная метка end , – допустим символ в метке в стандартных реализациях sed ).

С sed (см. Ответ @ HaukeLaging)

С awk :

 $ echo -e "a\nb\nc\nd\ne\nf\ng\nh" | awk 'NR==3 || NR==5{$0=$0"\ntest"}1;' 

С perl :

 $ echo -e "a\nb\nc\nd\ne\nf\ng\nh" | perl -pe '$_ .="test\n" if $. == 3 || $. == 5' 

Как сказал @HaukeLaging aleady, эта команда делает то, что вы хотите:

 sed -e'3a test' -e'5a test' 

Теперь это может стать довольно громоздким, если вы хотите совместить, например, 20 строк.

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

 sed -e{3,5}'a test' 

(Обратите внимание, что фигурные скобки и запятая должны оставаться без кавычек.)

В результате оболочка передаст аргументы в -e3a test и -e5a test для sed, что и делает первая команда.

  • Как скопировать строки из середины строк (между строками) до конца строк
  • Debian sed: невозможно прочитать
  • sed - заменить строку содержимым файла
  • sed: вставка текста перед концом раздела <HEAD>
  • Как я извлекаю пути к файлам из текстового файла?
  • Как извлечь число из строки ниже, которая является выводом команды?
  • Как напечатать определенные поля, если выполнено условие
  • Добавление текста в начало текстового файла
  • Добавить текст после определенной строки
  • sed, чтобы заменить пустую строку двумя строками содержимого
  • Awk / grep / sed получает разделенный запятыми список чисел из строк текста
  • Linux и Unix - лучшая ОС в мире.