숫자가 증가하는 줄을 파일에 추가

숫자가 증가하는 줄을 파일에 추가

텍스트 파일이 있는데 다음과 같이 파일에 줄을 추가하고 싶습니다.

#define ICFGx     0x2y

여기서 x는 0에서 시작하여 255에서 끝나는 10진수이며 각 줄마다 1씩 증가합니다. y는 000에서 시작하고 3FC에서 끝나는 16진수이며 각 줄마다 0x004씩 증가합니다.

#define ICFG0     0x2000
#define ICFG1     0x2004
#define ICFG2     0x2008
#define ICFG3     0x200C

또한 특정 줄, 예를 들어 500번 줄부터 시작하여 추가하고 싶습니다.

명령줄에서 이 작업을 수행할 수 있는 방법이 있습니까? 저는 Linux 터미널을 처음 사용했고 아직 bash 스크립팅을 많이 작성하지 않았습니다.

답변1

Bash에서는 이를 사용하여 printf출력 형식을 지정할 수 있습니다.

for i in {0..255} ; do
    printf "#define  ICFG%-3d     0x2%03X\n" $i $((i*4))
done > insert.txt

%d3크기를 나타내는 10진수 정수를 나타내며 빼기 기호는 왼쪽 정렬을 나타냅니다. 길이를 나타내는 X16진수 대문자를 나타내며 0으로 채워짐을 나타냅니다. 산술 확장을 소개합니다.30$(( ... ))

sed파일에 삽입하는 것뿐만 아니라

sed -i~ 500rinsert.txt input.txt

또는 Perl을 사용할 수도 있습니다.

perl -i~ -pe 'if ($. == 500) {
    printf "#define  ICFG%-3d     0x2%03X\n", $_, $_ * 4 for 0 .. 255 }
' -- input.txt
  • $.입력 줄 번호입니다.
  • 인쇄 기능동작은 bash의 동작과 유사합니다(적어도 %-3d및 의 경우 %03X).

답변2

awk '{print}; FNR == 500 {for (i  = 0; i < 256; i++)
  printf "#define ICFG%d\t%#x\n", i, 0x2000 + i*4}' < file.h

파일을 제자리에서 편집하려면 1 옵션 awk으로 바꾸고 gawk추가합니다 (그리고 내용을 제공하는 stdin -i /usr/share/awk/inplace.awk대신 파일 경로를 인수로 전달합니다 ).awk

gawk -i /usr/share/awk/inplace.awk '{print}; FNR == 500 {for (i  = 0; i < 256; i++)
  printf "#define ICFG%d\t%#x\n", i, 0x2000 + i*4}' file.h

zsh또는 ksh93대신 다음을 사용하여 bash이 텍스트를 생성할 수도 있습니다.

printf '#define ICFG%d %#x\n' {0..255}{,"*4+0x2000"}

bashfrom 에서 ksh93복사하는 것과 같지만 에 대한 인수에서 임의의 산술 표현식을 허용하지 않으므로 거기에서 루프를 사용해야 합니다.{0..255}zshprintf


^사용하지 마세요-i inplace현재 작업 디렉터리(as or)에서 확장 기능을 먼저 gawk로드 하려고 하면 누군가가 해당 디렉터리에 악성 코드를 심었을 수 있습니다. 시스템과 함께 제공되는 확장 프로그램 의 경로 는 다를 수 있습니다. 출력을 참조하세요.inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

관련 정보