RegEX를 사용하여 텍스트의 줄을 바꾸는 방법은 무엇입니까?

RegEX를 사용하여 텍스트의 줄을 바꾸는 방법은 무엇입니까?

내가 겪고 있는 문제는 두 개의 구분 기호 세트(위 및 아래)를 일치시키려는 것입니다.

아래 구분 기호의 두 번째 부분(굵게)만 일치시키려고 합니다.

여기에 이미지 설명을 입력하세요.

이렇게 하면 같은 날 만들어진 새 버전을 여러 파일에 추가할 수 있습니다. Perl을 사용하면 대체를 수행할 때 다음과 같은 결과를 얻을 수 있습니다. 여기에 이미지 설명을 입력하세요.

어쨌든 기반으로https://regex101.com/(그리고 명령을 실행할 때의 내 경험) 두 개의 구분 기호 세트를 선택합니다. 여기에 이미지 설명을 입력하세요.

위와 아래를 교체해 보세요. 여기에 이미지 설명을 입력하세요.

이것은 내가 사용하는 정규식입니다.

(?!V[0-9]{2}.[0-9]{2}.[0-9]{4}.1)(.*=.$)

UNIX의 명령:

perl -pe 's#(?!V[0-9]{2}.[0-9]{2}.[0-9]{4}.1)(.*=.$)#-* V02.11.2020.1 11/Feb/2020 Author2 Minor Changed Include lms \n -* ================ ============= ==================== =========== ========================================================/#g' path/to/file

아래에서 선택하는 방법이 있나요? 아니면 문제가 Negative Lookahead에서 발생합니까? -**************************************************** ***** *** *********************
편집
bey0nd가 선택한 명령을 사용했습니다

3,$s/ -\*  =[=[:space:]]*\// -*  V02.11.2020.1\t  11\/Feb\/2020\t  Author2\t\t   Minor\tChange include 1ms\n\0/1

가독성에 많은 도움이 됩니다

하지만 여전히 두 개의 구분 기호(= 기호)를 대체합니다. 정규식의 둘러보기 기능이 도움이 될 것이라고 생각합니다.

여기에 이미지 설명을 입력하세요.

저는 Perl 5와 sed 4.2를 사용하고 있습니다.

적어도 regex101.com에서는 작동하지만 내 버전에서는 작동하지 않습니다.

누군가가 유용하다고 생각하기를 바랍니다.

(-\*  =[=[:space:]]*\/)(?!\n.-\*[[:space:]].V[0-9]{2}.[0-9]{2}.[0-9]{4}.1*)

답변1

이것은 내가 사용할 sed 명령입니다:

sed -e '3,$s/ -\*  =[=[:space:]]*\// -*  V02.11.2020.1\t11\/Feb\/2020\tAuthor2\tMinor\tChange include 1ms\n\0/' file

탭을 레이아웃에 맞게 조정해야 할 수도 있습니다.

답변2

스크립트에 추가하고 싶은 내용이 있는 것 같습니다. 다음 텍스트가 포함된 testfile.txt라는 파일을 만들었습니다.

-* some lines
-* some more lines
-* ======= ====== ======= ======= =======/
-* data data data
-* more data more data more data
-* ====== ====== ======= ======= ======/

저는 단지 귀하의 특정 요구 사항에 맞게 사용자 정의할 수 있는 귀하의 파일과 대략 비슷해 보이도록 이 작업을 수행했습니다. 다음 명령(셸 스크립트에 입력할 수 있음)은 두 번째 구분 기호(데이터 섹션 끝) 앞에 "새 데이터 삽입 새 데이터 삽입 새 데이터 삽입"을 삽입합니다. 나는 이것이 당신이 원하는 일이라는 것을 이해합니다.

lines=`grep -nEe "=+" testfile.txt | sed -e s/":.*"//`
lines=`echo $lines`
read line1 line2 <<< $lines
sed -i ${line2}i"-* inserting new data inserting new data inserting new data" testfile.txt

내 마지막 파일은 이제

-* some lines
-* some more lines
-* ======= ====== ======= ======= =======/
-* data data data
-* more data more data more data
-* inserting new data inserting new data inserting new data
-* ====== ====== ======= ======= ======/

이로써 귀하의 질문에 대한 이해가 효과적으로 완료되었습니다. 이 작업을 완료하기 전에 해결해야 할 다른 문제가 있는지 명확히 해주세요.

내 정규식은 매우 간단합니다. 모든 등호가 있는 줄에서 일치 항목을 강제로 적용하고 파일이 "잘 작동"한다고 가정합니다. 파일 내용이 다를 수 있는 경우(예: 구분되지 않은 줄에 등호가 포함될 수 있는 경우) 더 구체적인 정규식이 필요할 수 있습니다. 귀하의 질문은 정규식을 직접 작성할 수 있고 두 번째 일치 항목을 얻는 데 도움이 필요하다는 것을 의미한다고 생각합니다. 또한 저는 여러분이 두 번째 게임만 원한다고 가정하고 있으며 항상 2개의 게임이 있을 것이라는 점에 유의하세요.

첫 번째 명령은 패턴과 일치하는 모든 줄 번호를 변수에 저장합니다 lines. 두 번째 명령은 변수에서 일종의 잘못된 문자 lines(무엇인지 잘 모르겠습니다) 를 지워 공백으로 구분되도록 합니다. 세 번째 명령은 일치하는 각 줄 번호를 자체 변수에 저장합니다(여기서는 정확히 2개의 일치 항목이 있다고 가정합니다). 네 번째는 두 번째 일치 이전에 필요한 새 데이터를 삽입합니다.

답변3

나는 Poisson Aerohead의 접근 방식이 아마도 더 나은 접근 방식이라고 생각합니다.
나는 단지 약간의 복잡성을 제거하고 싶습니다.

line=`grep -n '^ -\*  =*' testfile.txt | tail -1 |sed -e s/:.*//`
sed -i ${line}i'\ -* inserting new data ' testfile.txt

아래와 같이 행이 하나만 있는 경우에도(이 경우 마지막 행이기도 함) "-* =="로 시작하는 마지막 행 앞에 데이터가 삽입됩니다.
행이 없으면 각 행 앞에 삽입됩니다!

관련 정보