Изменение определенной строки в текстовом файле из командной строки - PullRequest
2 голосов
/ 14 июля 2020

У меня есть текстовый файл «text.txt», он содержит кучу строк с текстом (или пустых строк).

Я пытаюсь создать одну команду командной строки sed / awk, которая будет позвольте мне прокомментировать любое подобное (добавив "#" в начало любого номера строки, который я укажу).

Например, текстовый файл может выглядеть так: A B C D и я хочу выполнить команду который указывает номер строки 2, поэтому он будет выглядеть так: A #B C D Если возможно указать диапазон строк, можно изменить несколько строк, например, «2-4» или 2,3,4 », что тоже поможет .

Я обнаружил противоречивую (для меня) информацию о параметрах -n и -e в sed и просто не могу заставить его работать так, как я надеялся. Я использую Kubuntu 18.04.

Есть предложения? Спасибо.

Я объединил концепции, которые нашел в других вопросах, например, необходимость сохранить строку, но добавить "#" в ее начало, поэтому я у меня есть "s /(.*)/#$ 1 /" в качестве обратной замены.

Я думал, что это может сработать как: sed '2,4!s/(.<em>)/#$1/' text.txt Однако я get s/.: Event not found. В этом, похоже, есть несколько хороших частей, однако это не совсем сработало, как я надеялся, и работает только с одной строкой, а не со всеми строками cat text.txt | sed -n '2{s/(.</em>)/#$1/;p}'

Ответы [ 2 ]

5 голосов
/ 14 июля 2020

Это должно быть задание для awk. В этом решении, создавая имена переменных lines, которые будут иметь номера строк в зависимости от того, что вы хотите изменить (разделенные запятыми), просто укажите любое количество номеров строк со значениями, разделенными запятыми, и это должно помочь здесь. Успешно протестирован на https://ideone.com/ajnNSU

awk -v lines="2,3,4" '
BEGIN{
  num=split(lines,array,",")
  for(i=1;i<=num;i++){
    linechange[array[i]]
  }
}
FNR in linechange{
  $0="#" $0
}
1
' Input_file
2 голосов
/ 14 июля 2020

Простая замена sed также будет работать с учетом номера строки, например,

sed -i '2s/^/# /' file

Приведенное выше отредактирует file на месте, комментируя строку 2, вставив "# " в начало строки. Чтобы передать номер строки в качестве аргумента, двойные кавычки выражение, например,

#!/bin/bash

sed -i "$1s/^/# /" "$2"

Примет номер строки в качестве первого аргумента, а файл для комментария - в качестве второго и отредактируйте файл на месте, оставив комментарий. Вы должны проверить, что первый аргумент является целым числом, а второй - это файл, который существует и не является пустым. Если вы сохраните сценарий как cmt и сделаете его исполняемым (например, chmod +x cmt), тогда вы закомментируете вторую строку в file как:

./cmt 2 file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...