grep 후에 찾은 텍스트 옆의 텍스트를 어떻게 변경합니까?

grep 후에 찾은 텍스트 옆의 텍스트를 어떻게 변경합니까?

예를 들어 Linux 환경에는 다음 텍스트가 포함된 test1 파일이 있습니다.

DB_UP
sqlplus DB_UP test1.sql
DB_UP

sqlplus 옆에 있는 DB_UP을 제거하고 싶습니다. 실제로 편집하려는 줄 앞뒤에 가변 개수의 DB_UP이 있는 여러 파일에서 이 작업을 어떻게 수행합니까?

xarg -i를 사용해 보았지만 sqlplus 전후에 DB_UP도 제거되었습니다.

나는 출력을 다음과 같이 원한다:

DB_UP
sqlplus test1.sql
DB_UP

답변1

sed substitute 명령은 한 줄의 s/DB_UP//첫 번째 줄을 DB_UP아무것도 없는 것으로 바꿉니다(즉, 삭제).

이제 : 로 시작하는 줄에 대해서만 이 작업 을 수행하려고 하므로 sqlplus이를 ^sqlplus명령의 주소(조건) 로 사용하십시오 s. 행의 시작 부분에 패턴을 /^sqlplus/s/DB_UP//고정합니다 .^

sed귀하의 버전이 대화형으로 파일을 변경하는 옵션을 지원하는지 확인한 -i다음 변경하려는 파일을 반복하여 스크립트를 적용할 수 있습니다.

sed -i '/^sqlplus/s/DB_UP//' file1 file2 file3

일부 sed버전에서는 에서 이 작업을 수행해야 합니다 -i. 문제가 발생할까 봐 걱정된다면 이는 좋은 생각일 수 있지만 모든 것이 제대로 작동하는지 확인한 후에 백업 파일을 삭제하는 것이 좋습니다.

답변2

DB_UP행당 인스턴스가 하나만 있다고 가정하면 다음을 사용합니다.

sed 's/\(^.*\)\(DB_UP\)\(.*\)$/\1\3/'

@berndbausch bash 루프는 모든 파일 내용을 교체해야 하는 경우 완벽하게 작동합니다.

for file in f1 f2 f3 f3 f4; do
    sed -i.bak 's/\(^.*\)\(DB_UP\)\(.*\)$/\1\3/' "$file"
done

답변3

그리고 awk:

   awk '/sqlplus\s{1,}DB_UP/{gsub(/sqlplus\s{1,}DB_UP/, "sqlplus");print; next}1' file

gsub()기능은 DB_UP다음 기능을 대체합니다.sqlplus 그리고공백.

이는 다음 명령으로 단축될 수 있습니다.

awk '{gsub(/sqlplus  *DB_UP/, "sqlplus")}1' file

관련 정보