내가 겪고 있는 문제는 두 개의 구분 기호 세트(위 및 아래)를 일치시키려는 것입니다.
아래 구분 기호의 두 번째 부분(굵게)만 일치시키려고 합니다.
이렇게 하면 같은 날 만들어진 새 버전을 여러 파일에 추가할 수 있습니다. 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
아래와 같이 행이 하나만 있는 경우에도(이 경우 마지막 행이기도 함) "-* =="로 시작하는 마지막 행 앞에 데이터가 삽입됩니다.
행이 없으면 각 행 앞에 삽입됩니다!