변수 행에서 문자열을 삭제하고 싶습니다.
remove_text=' hi'
;
문서:
kjdkjdkjddkjd
djdk hi sjjsj
jfjf sisj hi
jdkjdk dkjdkdjd hi
hi sksk
hi
N 행 (이 경우 2행 ) 에서 삭제 하고 싶습니다 .
문서:
kjdkjdkjddkjd
djdk sjjsj
jfjf sisj hi
jdkjdk dkjdkdjd hi
hi sksk
답변1
매우 간단합니다 sed
.
sed '2s/hi//' filename
여기서 2s
subs on line 2
( hi
첫 번째 슬래시 쌍의 패턴)은 교체될 패턴이고, 두 번째 슬래시 쌍 사이에는 패턴이 제거되지 않습니다.
이 명령은 변수에도 작동하지만 아래와 같이 작은따옴표 대신 큰따옴표로 명령을 묶어야 합니다.
remove_text=' hi'
sed "2s/${remove_text}//" filename
변수를 통해 줄 번호를 선택하려는 경우에도 그렇게 할 수 있습니다.
ln=2
remove_text=' hi'
sed "${ln}s/${remove_text}//" filename
-i
with 옵션 을 사용하면 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