텍스트 파일의 전체 줄을 줄 번호로 바꾸는 방법
파일의 전체 줄을 대체하는 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
'programing' 카테고리의 다른 글
postgres: 사용자를 슈퍼 유저로 업그레이드하시겠습니까? (0) | 2023.04.27 |
---|---|
Angular에서 @Input() 값이 변경될 때 감지하는 방법은 무엇입니까? (0) | 2023.04.27 |
Excel VBA 코드 단위 테스트 방법 (0) | 2023.04.27 |
서로 다른 서버의 두 데이터베이스에 있는 두 개의 테이블을 결합하여 데이터 쿼리 (0) | 2023.04.27 |
zure 웹 사이트에서 업로드된 인증서 액세스 (0) | 2023.04.27 |