텍스트 파일이 있는데 다음과 같이 파일에 줄을 추가하고 싶습니다.
#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
%d
3
크기를 나타내는 10진수 정수를 나타내며 빼기 기호는 왼쪽 정렬을 나타냅니다. 길이를 나타내는 X
16진수 대문자를 나타내며 0으로 채워짐을 나타냅니다. 산술 확장을 소개합니다.3
0
$(( ... ))
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"}
bash
from 에서 ksh93
복사하는 것과 같지만 에 대한 인수에서 임의의 산술 표현식을 허용하지 않으므로 거기에서 루프를 사용해야 합니다.{0..255}
zsh
printf
^사용하지 마세요-i inplace
현재 작업 디렉터리(as or)에서 확장 기능을 먼저 gawk
로드 하려고 하면 누군가가 해당 디렉터리에 악성 코드를 심었을 수 있습니다. 시스템과 함께 제공되는 확장 프로그램 의 경로 는 다를 수 있습니다. 출력을 참조하세요.inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'