printf를 사용하여 파일 시작 부분에 서식 있는 텍스트 삽입

printf를 사용하여 파일 시작 부분에 서식 있는 텍스트 삽입

텍스트 파일 시작 부분에 특정 형식의 콘텐츠를 추가해야 합니다. 나는 조사했다Bash에서 여러 텍스트 파일의 시작과 끝에 텍스트를 추가하는 방법, 하지만 내 상황에 어떻게 적응해야 할지 모르겠습니다.

암호

printf 'Anything\tyou\twant\tto\tadd' 0a . x | ex printf.csv

예상 출력

$ head -n 1 printf.csv;
Anything     you    want   to    add

참고: 저는 printf해결책을 선호합니다.

답변1

의 경우 ex다음과 같을 것입니다.

printf '%b\n' 0a 'Anything\tyou\twant\tto\tadd' . x | ex -s printf.csv

또는:

printf '0a\nAnything\tyou\twant\tto\tadd\n.\nx\n' | ex -s printf.csv

매개변수에 의해 인식되는 이스케이프 시퀀스는 %b형식 매개변수의 이스케이프 시퀀스와 다릅니다. 전자는 표준 echo이고 후자는 표준 C와 유사합니다(많은 printf구현에서 이를 확장하지만). 그것과 별 차이는 없지만 , (적어도 이식성을 원한다면) \t매개변수에 이를 작성해야 합니다 .\11\011%b

또 다른 옵션은 확장을 위해 %sksh93 스타일 따옴표를 사용하는 것입니다 .$'...'\t

printf '%s\n' 0a $'Anything\tyou\twant\tto\tadd' . x | ex -s printf.csv

지원되는 경우(적어도 ksh93, zsh, bash, FreeBSD sh, busybox ash) 이러한 $'...'인용문은 일반적으로 형식 매개변수에서와 같이 표준 C 이스케이프(확장 포함)를 지원합니다 printf( %b또는echo

답변2

  1. printf옵션이 아닌 첫 번째 인수로 형식 문자열을 전달합니다. 첫 번째 매개변수가 와 같은 형식 지정자를 사용하지 않으면 %s나머지 매개변수는 사실상 쓸모가 없습니다. 따라서 이스케이프 문자가 해석되는 첫 번째 인수를 사용하려면 \t나머지 텍스트도 여기에 맞아야 합니다.
  2. 이 답변은 다음과 같이 말합니다.

    0a"0행 뒤에 텍스트 추가"(즉, 1행 앞에)를 의미합니다. 다음 줄은 0번 줄 뒤에 "추가"되는 리터럴 텍스트입니다. .줄 자체의 마침표( )는 추가할 텍스트를 끝냅니다.

    0a와야 해앞으로추가할 텍스트입니다.

따라서 다음과 같습니다.

printf '0a\nAnything\tyou\twant\tto\tadd\n.\nx\n' | ex printf.csv 

예:

% printf '0a\nAnything\tyou\twant\tto\tadd\n.\nx\n' | ex printf.csv
"printf.csv" [New file]
"printf.csv" [New file] 1 line, 25 characters
% cat printf.csv                                                                                 
Anything    you want    to  add

답변3

cat명령을 사용하면 됩니다 . conCAT 파일과 함께 사용하도록 설계되었습니다.

test.txt다음 내용이 포함된 파일이 있다고 가정해 보겠습니다 .

Test file
Here it is

다음과 같이 printf및로 시작하는 텍스트를 추가 할 수 있습니다 .catprintf "Some fancy text\n" | cat - test.txt

Some fancy text
Test file
Here it is

출력을 다른 파일로 리디렉션하고 마지막으로 이전 파일 위치에 저장할 수 있습니다(이 경우).

printf "Some fancy text\n" | cat - test.txt > /tmp/insertTestFile && mv /tmp/insertTestFile test.txt

이것은 단지 개념 증명일 뿐입니다. 실제 시나리오에서는 다음 제한 사항을 고려해야 합니다.

  • 고정된 이름을 가진 디렉토리에 파일을 생성하는 /tmp것은 좋지 않습니다 . tempfile필요한 경우 명령을 사용하여 파일을 생성하고 해당 이름을 변수에 저장하는 것을 고려하십시오.
  • 다른 파일 시스템에서 사용하면 mv파일이 복사됩니다.
  • 위의 솔루션은 새 파일을 생성하고 해당 권한 및 acl과 함께 이전 파일을 삭제합니다.

내 목표는 초보자가 이해하기 쉬운 간단한 솔루션을 보여주는 것입니다. 이 답변에 댓글을 달고 오해의 소지가 있는 점을 지적해주신 모든 분들께 감사드립니다.

추신. 내가 가장 좋아하는 방법은 다음과 같습니다.sed -i '1s/^/Added text\n/' file.txt

관련 정보