파일의 n번째 줄에 있는 텍스트를 삭제하세요.

파일의 n번째 줄에 있는 텍스트를 삭제하세요.

변수 행에서 문자열을 삭제하고 싶습니다. remove_text=' hi';

문서:

kjdkjdkjddkjd
djdk hi sjjsj
jfjf sisj hi
jdkjdk dkjdkdjd hi
hi sksk

hiN (이 경우 2행 ) 에서 삭제 하고 싶습니다 .

문서:

kjdkjdkjddkjd
djdk sjjsj
jfjf sisj hi
jdkjdk dkjdkdjd hi
hi sksk

답변1

매우 간단합니다 sed.

sed '2s/hi//' filename

여기서 2ssubs on line 2( hi첫 번째 슬래시 쌍의 패턴)은 교체될 패턴이고, 두 번째 슬래시 쌍 사이에는 패턴이 제거되지 않습니다.

이 명령은 변수에도 작동하지만 아래와 같이 작은따옴표 대신 큰따옴표로 명령을 묶어야 합니다.

remove_text=' hi'
sed "2s/${remove_text}//" filename

변수를 통해 줄 번호를 선택하려는 경우에도 그렇게 할 수 있습니다.

ln=2
remove_text=' hi'
sed "${ln}s/${remove_text}//" filename

-iwith 옵션 을 사용하면 sed파일이 제자리에서 교체되거나 업데이트됩니다.

답변2

아무거나 사용하세요:

remove_text=' hi';

awk -v rmtxt="$remove_text" '
NR==2{ len=length(rmtxt); ind=index($0, rmtxt);
       print substr($0, 1, ind-1) substr($0, ind+len)
}1' infile

또는 match()함수를 사용하십시오(match()는 두 번째 인수를 정규식으로 처리합니다).

awk -v rmpat="$remove_text" '
NR==2{ match($0, rmpat);
       print substr($0, 1, RSTART-1) substr($0, RSTART+RLENGTH)
}1' infile

특히 이것은 "의 첫 번째 발생을 찾는 것입니다.텍스트 삭제" 입력의 두 번째 줄에 두 개의 하위 문자열(앞부분과 끝부분)을 인쇄합니다.


"를 모두 제거하려는 경우텍스트 삭제”, 다음과 같이 진행합니다.

awk -v rmtxt="$remove_text" 'BEGIN { FS=rmtxt; OFS="" } NR==2{ $1=$1 }1' infile

이것이 정의이다"텍스트 삭제"를 awk의 필드 구분 기호로 사용하고 입력의 두 번째 줄에 FS/OFS에 대해 입력 줄을 재평가하고 1사용된 최종 변경 사항을 인쇄합니다.

또는 gsub()함수를 사용하세요. 단, gsub()를 사용하면 "텍스트 삭제" 가치정규식리터럴 문자열의 문자열 일치를 기반으로 하는 위의 솔루션 대신:

awk -v rmpat="$remove_text" 'NR==2{ gsub(rmpat, "") }1' infile

관련 정보