programing

텍스트 파일의 전체 줄을 줄 번호로 바꾸는 방법

bestprogram 2023. 4. 27. 22:51

텍스트 파일의 전체 줄을 줄 번호로 바꾸는 방법

파일의 전체 줄을 대체하는 bash 스크립트가 필요한 상황이 있습니다.라인 번호는 항상 동일하므로 하드 코딩된 변수일 수 있습니다.

해당 줄의 일부 하위 문자열을 바꾸려는 것이 아니라 해당 줄을 완전히 새 줄로 바꾸려는 것입니다.

이를 위한 bash 방법(또는 .sh 스크립트에 넣을 수 있는 간단한 방법)이 있습니까?

최고는 아니지만, 이것은 효과가 있을 것입니다.

sed -i 'Ns/.*/replacement-line/' file.txt

N대상 라인 번호로 대체해야 합니다.원래 파일의 줄이 바뀝니다.하려면, ,-i옵션:

sed 'Ns/.*/replacement-line/' file.txt > new_file.txt

저는 사실 얼마 전에 회사의 유닉스 서버에 있는 cron 파일의 코드 줄을 바꾸기 위해 이 스크립트를 사용했습니다.일반 셸 스크립트로 실행했으며 문제가 없었습니다.

#Create temporary file with new line in place
cat /dir/file | sed -e "s/the_original_line/the_new_line/" > /dir/temp_file
#Copy the new file over the original file
mv /dir/temp_file /dir/file

번호로 것이 줄줄할 수 .s/그리고 다음 위치에 와일드카드를 배치합니다.the_original_line.

4행을 "different" 텍스트로 바꾸려고 합니다.AWK는 다음과 같이 사용할 수 있습니다.

awk '{ if (NR == 4) print "different"; else print $0}' input_file.txt > output_file.txt

AWK는 입력을 "필드"로 구분된 "레코드"로 간주합니다.기본적으로 한 줄은 한 레코드입니다. NR표시된 레코드 수입니다. $0현재 완료 레코드를 나타냅니다(한편).$1는 레코드 등의 첫 번째 필드이며, 기본적으로 필드는 줄에 있는 단어입니다.

따라서 현재 줄 번호가 4이면 "different" 문자열을 인쇄하지만 그렇지 않으면 변경되지 않은 줄을 인쇄합니다.

AWK로 동봉된 입니다.{ }각 입력 레코드에서 한 번 실행됩니다.

이 AWK 프로그램과 을 해석하려고 .$0.

편집: 아래 댓글에 있는 @chepner의 더 짧고 우아한 AWK 프로그램:

awk 'NR==4 {$0="different"} { print }' input_file.txt

레코드(예: 줄) 번호 4에 대해서만 전체 레코드를 "different" 문자열로 바꿉니다.그런 다음 모든 입력 레코드에 대해 레코드를 인쇄합니다.

분명히 내 AWK 실력은 녹슬었어요!감사합니다, @chefner.

편집: 그리고 @Dennis Williamson의 훨씬 더 짧은 버전도 참조하십시오.

awk 'NR==4 {$0="different"} 1' input_file.txt

: 이이어작설있댓습다니어명되.1항상 true로 평가되므로 관련 코드 블록이 항상 실행됩니다.그러나 연관된 코드 블록은 없으며, 이는 AWK가 단지 전체 라인을 인쇄하는 기본 동작을 수행한다는 것을 의미합니다.AWK는 이와 같은 간결한 프로그램을 허용하도록 설계되었습니다.

해당 테스트 파일(test.txt)

Lorem ipsum dolor sit amet,
consectetur adipiscing elit. 
Duis eu diam non tortor laoreet 
bibendum vitae et tellus.

다음 명령은 첫 번째 줄을 "새 줄 텍스트"로 바꿉니다.

$ sed '1 c\
> newline text' test.txt

결과:

newline text
consectetur adipiscing elit. 
Duis eu diam non tortor laoreet 
bibendum vitae et tellus.

자세한 내용은 여기에서 확인할 수 있습니다.

http://www.thegeekstuff.com/2009/11/unix-sed-tutorial-append-insert-replace-and-count-file-lines/

bash에서 N,M을 줄 번호로 바꾸고 xxx yyy를 원하는 대로 바꿉니다.

i=1
while read line;do
  if((i==N));then
    echo 'xxx'
  elif((i==M));then
    echo 'yyy'
  else
    echo "$line"
  fi
  ((i++))
done  < orig-file > new-file

편집

실제로 이 솔루션에는 "\0" "\t" 및 "\" 문자와 같은 몇 가지 문제가 있습니다.

"\t"는 IFS=를 읽기 전에 "\", 행 끝에 -r을 붙여서 풀 수 있습니다.

IFS= read -r line

그러나 "\0"의 경우 변수가 잘리고 순수 bash에는 솔루션이 없습니다. Bash의 변수에 null 문자(\0)를 포함하는 문자열을 할당하지만 일반 텍스트 파일에는 null 문자 \0이 없습니다.

펄이 더 나은 선택일 것입니다.

perl -ne 'if($.==N){print"xxx\n"}elsif($.==M){print"yyy\n"}else{print}' < orig-file > new-file
# Replace the line of the given line number with the given replacement in the given file.
function replace-line-in-file() {
    local file="$1"
    local line_num="$2"
    local replacement="$3"

    # Escape backslash, forward slash and ampersand for use as a sed replacement.
    replacement_escaped=$( echo "$replacement" | sed -e 's/[\/&]/\\&/g' )

    sed -i "${line_num}s/.*/$replacement_escaped/" "$file"
}

체프너의 훌륭한 답변입니다.그것은 bash Shell에서 나에게 효과가 있습니다.

 # To update/replace the new line string value with the exiting line of the file
 MyFile=/tmp/ps_checkdb.flag

 `sed -i "${index}s/.*/${newLine}/" $MyFile`

여기서
index라인 번호
newLine바꿀 새 줄 문자열입니다.


마찬가지로 아래 코드는 파일의 특정 행을 읽는 데 사용됩니다.이것은 실제 파일에 영향을 미치지 않습니다.

LineString=`sed "$index!d" $MyFile` 

여기서
!d라인 번호 이외의 라인을 삭제합니다.$index그래서 우리는 출력을 no의 라인 문자열로 받을 것입니다.$index서류철에

내가 사용한 맥에서

sed -i '' -e 's/text-on-line-to-be-changed.*/text-to-replace-the=whole-line/' file-name

줄 바꾸기sed c\

언급

sed c\실제로 파일을 변경하지 않으므로 출력을 임시 파일로 보내야 합니다.cat임시 파일을 원본에 추가합니다.라인을 지정할 수 있기 때문에 일치 패턴이 필요하지 않습니다.예:sed '1 c\'=>가 1행의 텍스트를 대체합니다.

명령어를 작성할 때, 다음 명령어 뒤에 있는 모든 것입니다.c\부품이 새 줄로 들어가며 새 줄 텍스트를 포함해야 합니다.


마지막으로, 이름이 지정된 파일에서 줄 1을 "바꾸는" 예제original_file.txt'foo'라는 문자가 있는sed 출력을 가져와 임시 파일에 저장한 다음 임시 파일을 다시 원본으로 출력합니다.

# file contents
$ cat original_file.txt
bar

# the replace command
$ sed '1 c\
  foo' original_file.txt > temp_file.txt
 
# output contents of temp_file and overwrite original
$ cat temp_file.txt > original_file.txt

# delete the temp file
$ rm -rf temp_file.txt

만약 당신이 lineNumber와 line을 대체하기 위해 파라미터를 사용하고 싶다면, awk는 (나에게) 쉽게 작동하지 않습니다.1시간 후에 실행합니다. 아래에 보시면 됩니다 :)

lineNumber=$(grep --line-number "u want to replace line any keyword" values.txt  | cut -f1 -d:)
replacedLine="replacing new Line "
# for sed prepare => if your replacedLine have '/' character (URL or something) u must use command bellow. 
replacedLine=${replacedLine//\//\\\/}

sed -i $lineNumber's/.*/'"$replacedLine"'/'  values.txt

sed 명령에 매개 변수를 전달할 수도 있습니다.

test.sh

#!/bin/bash
echo "-> start"
for i in $(seq 5); do
  # passing parameters to sed
  j=$(($i+3))
  sed -i "${j}s/.*/replaced by '$i'!/" output.dat
done
echo "-> finished"
exit 

original output.dat:

a
b
c
d
e
f
g
h
i
j

./test.sh 을 실행하면 새 output.dat이 제공됩니다.

a
b
c
replaced by '1'!
replaced by '2'!
replaced by '3'!
replaced by '4'!
replaced by '5'!
i
j

언급URL : https://stackoverflow.com/questions/11145270/how-to-replace-an-entire-line-in-a-text-file-by-line-number