Замените целую строку в файле от командной строки

Принятие Вас знает Python, и если Вы не делаете сегодня хороший день для запуска... документация для способной привязки Python имеет обработанный пример, который релевантен, хотя это не может быть полное решение.

apt-get install python-apt python-apt-doc

и посмотрите на /usr/share/doc/python-apt-doc/examples/missing-deps.py. Я использую Debian, сжимают.

Я просто попробовал его

python missing-deps.py

и это действительно производит маленький список пакетов. Мое понимание этого сценария - то, что он производит список пакетов, которые являются в настоящее время неустанавливаемыми на основном Debian. Однако у меня нет Debian нестабильной установкой удобный в данный момент для тестирования его с.

5
26.07.2012, 20:27
4 ответа
sed -i "/^version =/s/'[^']*'/'NEW_VERSION_IS_HERE'/" your_file
4
27.01.2020, 20:35
  • 1
    Спасибо за ответ! К сожалению, это дает следующую ошибку: sed: 1: "conf.py": command c expects \ followed by text - у Вас есть какие-либо идеи? –  robintw 29.03.2012, 00:57
  • 2
    @robintw для меня. Вы скопировать/вставить это неправильно? –  tylerl 29.03.2012, 02:08
  • 3
    -i опция к sed нестандартно и обычно повреждает символьные ссылки. Если у Вас есть GNU sed Вы почти всегда хотите добавить опцию к --follow-symlinks. В целом я рекомендую избежать sed -i и использование ed вместо этого. Файлы не являются потоками. –  jw013 29.03.2012, 03:21
  • 4
    @robintw: Какую операционную систему Вы используете? Вы, вероятно, не используете GNU sed. Если бы мы знали, какой определенный вариант видят, что Вы имеете, то мы могли более точно предоставить ответ. –  bahamat 26.07.2012, 23:57

Если $X параметр, где новая версия хранится,

ed file << EOF
g/^version =/s/.*/version = '$X'/
g/^release =/s/.*/release = '$X'/
w
q
EOF

Это принимает $X имеет рыночную стоимость, как 1.2.3-foo, и никакие символы, которые специальны для ed интерпретатор команд.

2
27.01.2020, 20:35

Один способ использовать perl:

Принятие infile имеет содержание, которое Вы вставили в своем вопросе.

Содержание script.pl:

use warnings;
use strict;
use Getopt::Long;

## Check arguments.
die qq[Usage: perl $0 <file> [--version=<num>] [--release=<num>]\n] unless @ARGV > 1;

my ($version, $release);

## Get value of arguments.
GetOptions(
    q[version=f] => \$version,
    q[release=f] => \$release,
) or die qq[ERROR: Bad input arguments\n];

## Sanity check.
exit 0 if ! defined $version && ! defined $release;

## Read input file line by line, and substitute values of 'version' and 'release'
## when matched.
while ( <> ) { 
    chomp;
    s/\A((?i:version)\s*=\s*')([^']+)(?=')/$1 . (defined $version ? $version : $2)/e;
    s/\A((?i:release)\s*=\s*')([^']+)(?=')/$1 . (defined $release ? $release : $2)/e;

    printf qq[%s\n], $_; 
}

Выполните его как:

perl script.pl infile --version=1.3 --release=2.6

Со следующим выводом:

# General information about the project.
project = u'Py6S'
copyright = u'2012, Robin Wilson'

# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '1.3'
# The full version, including alpha/beta/rc tags.
release = '2.6'
3
27.01.2020, 20:35

Как сценарий оболочки:

#!/bin/ksh

function usage {
    echo
    echo "Usage: $0 <file> <version> <release>"
    echo
    exit 1
}

function update_version {
    cat $file | sed -e "s/^version.*$/version = \'$version\'/" > $file.new
    mv $file.new $file
}

function update_release {
    cat $file | sed -e "s/^release.*$/release = \'$release\'/" > $file.new
    mv $file.new $file
}

file=$1
version=$2
release=$3

if [ ! -f $file ]; then
    usage
fi

if [ $# != 3 ]; then
    usage
fi

update_version
update_release

Это - просто быстрый пример. Это не делает никакой проверки ошибок, и это не создает резервную копию исходного файла в случае одного из выходных перенаправлений, стирающих его и оставляющих Вас с пустым файлом. То, что я говорю, не используют это в производстве, но оно даст Вам и идее того, как сделать то, что Вы пытаетесь сделать.

0
27.01.2020, 20:35

Теги

Похожие вопросы