명령줄에서 파일의 전체 줄 바꾸기

명령줄에서 파일의 전체 줄 바꾸기

다음과 유사한 내용을 포함하는 텍스트 파일이 있습니다.

# 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 = '0.5'
# The full version, including alpha/beta/rc tags.
release = '0.5'

X가 스크립트에 제공된 명령줄 인수인 version = '0.5'줄을 바꾸고 해당 줄에 대해 동일한 작업을 수행하고 싶습니다 .version = Xrelease =

이러한 종류의 교체를 수행하기 위해 호출할 수 있는 간단한 명령이 있습니까? 조금 살펴봤지만 sedsed의 전역 대체를 위해서는 를 검색해야 하는 것 같습니다 version = '0.5'. 하지만 제가 정말로 검색하고 싶은 것은 다음으로 시작하는 줄뿐입니다 version =. 스크립트를 실행하세요!

어떤 아이디어가 있나요?

답변1

sed -i "/^version =/s/'[^']*'/'NEW_VERSION_IS_HERE'/" your_file

답변2

다음을 사용하는 편도 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

$X새 버전이 저장되는 매개변수 인 경우

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

이는 $X와 같은 합리적인 값이 있고 명령 해석기 1.2.3-foo에 특별한 문자가 없다고 가정합니다 ed.

답변4

쉘 스크립트로:

#!/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

이것은 단지 간단한 예일 뿐입니다. 오류 검사를 수행하지 않으며 출력 리디렉션 중 하나가 원본 파일을 지우고 빈 파일을 남겨두는 경우 원본 파일을 백업하지 않습니다. 제가 말하고자 하는 것은 이것을 프로덕션에서 사용하지 말라는 것입니다. 하지만 이를 통해 여러분이 하려는 작업을 수행하는 방법에 대한 아이디어를 얻을 수 있을 것입니다.

관련 정보