예를 들어 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
s
ubstitute 명령은 한 줄의 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