однострочная команда для добавления слова в переменную в кавычках в файле и сообщения о том, хорошо это или плохо - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть файл, который выглядит так:

VAR1="one two three"
VAR2="four five six"
VAR3="seven eight nine"

Я пытаюсь найти команду, которая изменяет этот файл, вместо этого:

  1. Найтистрока, которая соответствует регулярному выражению /^VAR2=".*?"/
  2. Закомментируйте это
  3. Добавить # и затем текущую дату (например, # 2019-02-04)
  4. Дублируйте строку, но добавьте test внутри строки и добавьте # с сегодняшней датой к концу строки

Таким образом, конечный результат выглядит следующим образом:

VAR1="one two three"
# VAR2="four five six" # 2019-02-04
VAR2="four five six test" # 2019-02-04
VAR3="seven eight nine"

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

sed -i -r -e "s/^(VAR2=\".*?)(\")/# \1\2 # $(date +'%Y-%m-%d')\n\1 test\2 # $(date +'%Y-%m-%d')/" file

Еслиэто имеет значение, строка замены никогда не будет содержать регулярное выражение.

Я открыт для лучших способов сделать это.Целью является в основном редактирование файлов конфигурации и добавление символов в значения переменных, а также дублирование строки и комментария для целей резервного копирования.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

РЕДАКТИРОВАТЬ: Поскольку OP упоминается в комментариях, оператору необходимо печатать, если найдено совпадение строки, начинающейся с VAR2, или нет, добавляя решение в awk сейчас.

awk -v dat="$dat" '
/^VAR2.*/{
  found=1
}
found && /^VAR2.*/{
  print "Line starting with VAR2 has been found on Line " FNR "."
  $0="# " $0 " # " dat ORS $0 " # " dat
}
{
  print > "temp"
}
END{
  if(!found){
     print "NO line starting with VAR2 found."
  }
}' Input_file && mv temp Input_file

Где dat - это awk переменная, в которой содержится dat значение переменной оболочки.Вывод будет следующим:

VAR1="one two three"
Line starting with VAR2 has been found on Line 2.
# VAR2="four five six" # 2019-02-05
VAR2="four five six" # 2019-02-05
VAR3="seven eight nine"


Не могли бы вы попробовать следующее.Вы можете создать переменную BASH, которая имеет значение даты из системы, а затем использовать ее в sed как аккуратный и чистый процесс.

cat << EOF > Input_file
VAR1="one two three"
VAR2="four five six"
VAR3="seven eight nine"
EOF

dat=$(date +%Y-%m-%d)
echo $dat

sed "/^VAR2.*/s/^VAR2.*/# & # $dat\n& # $dat/g" Input_file

Вывод будет следующим.

2019-02-05   ##This value is getting printed from echo command of shell.
VAR1="one two three"
# VAR2="four five six" # 2019-02-05
VAR2="four five six" # 2019-02-05
VAR3="seven eight nine"
0 голосов
/ 05 февраля 2019

Я бы использовал Perl пирог так:

$ cat yourfile.txt
VAR1="one two three"
VAR2="four five six"
VAR3="seven eight nine"
$ export d=`date +%Y-%m-%d` ; perl -p -i.old -e 'my $date = $ENV{d}; s/^VAR2(.*)"$/#VAR2\1" # $date\nVAR2\1 test" # $date/g' yourfile.txt
$ echo $?
0
$ cat yourfile.txt
VAR1="one two three"
#VAR2="four five six" # 2019-02-04
VAR2="four five six test" # 2019-02-04
VAR3="seven eight nine"

Если вы хотите "статус", попробуйте это:

$ cat yourfile2.txt
VAR1="one two three"
VAR3="seven eight nine"
$ export d=`date +%Y-%m-%d` ; perl -p -i.old -e 'my $date = $ENV{d}; s/^VAR2(.*)"$/#VAR2\1" # $date\nVAR2\1 test" # $date/g' yourfile.txt ; grep "^VAR2" yourfile2.txt > /dev/null
$ echo $?
1

-i.old это дает файл резервной копиис указанным расширением, если произошли изменения:

$ cat yourfile.txt.old
VAR1="one two three"
VAR2="four five six test"
VAR3="seven eight nine"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...