3행 끝에 경로를 삽입하는 방법

3행 끝에 경로를 삽입하는 방법

이름이 DRC.txt.인 아래 표시된 파일을 고려하십시오. 이 파일의 내용은 다음과 같습니다.

#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck"
action $a set_parameter "options"

이제 이라는 변수가 생겼습니다 ruledeck = /praj/test/drc_tsn/test1. DRC.txt의 세 번째 줄 끝에 경로인 이 변수의 값을 추가해야 합니다. 를 사용하여 이를 시도했지만 sed경로는 추가되지 않고 변수만 추가됩니다. 위의 문제를 어떻게 해결할 수 있나요?

sed -i -e '3s/$/"$ruledeck"/' DRC.txt

이 명령의 출력은 다음과 같습니다.

#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck" $ruledeck
action $a set_parameter "options"

나는 다음과 같은 출력을 원합니다 :

#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck" /praj/test/drc_tsn/test1
action $a set_parameter "options"

답변1

여기에는 두 가지 문제가 있습니다. 첫째, sed명령이 작은따옴표( '')로 묶여 있으므로 변수가 확장되지 않습니다.

$ echo $ruledeck 
/praj/test/drc_tsn/test1
$ echo '$ruledeck'
$ruledeck

명령에서 변수를 큰따옴표로 묶은 것을 알 수 있지만 sed전체가 작은따옴표이므로 아무 것도 변경되지 않습니다. 대신 큰따옴표를 사용해야 합니다.

sed -e "3s/$/$ruledeck/" file

그러나 이것도 중단됩니다.

$ sed -e "3s/$/$ruledeck/" file
sed: -e expression #1, char 8: unknown option to `s'

이는 변수에 가 포함되어 있지만 이를 대체 연산자( ) 에 대한 구분 기호 로 /도 사용하고 있기 때문입니다. 다른 구분 기호가 필요합니다. 이렇게 하면 원하는 작업이 수행됩니다./s///

$ sed -e "3s|$|$ruledeck|" file
#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck"/praj/test/drc_tsn/test1
action $a set_parameter "options"

그러나 줄 끝에 공백이 없으면 이는 여전히 정확하지 않습니다. 공백이 아직 없는 경우 추가하려면 \?(공백 및 이스케이프된 물음표)를 사용하여 "0 또는 1 공백"과 일치시킵니다. 이 모든 것을 종합하면 다음과 같습니다.

$ sed -e "3s| \?$| $ruledeck|" file
#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck" /praj/test/drc_tsn/test1
action $a set_parameter "options"

답변2

3행 뒤에 행을 추가 한 다음 3행을 새 4행과 연결하면 ed따옴표 및 정규식 구분 기호 관련 문제를 피할 수 있습니다. 예를 들어

printf "%s\n" 3a " $ruledeck" . 3,4j  wq | ed -s DRC.txt

printf "%s\n"나머지 인수 각각을 ed한 번에 하나씩 텍스트 편집기로 파이프하는 데 사용됩니다.

exor vi -e( vim -e또는 vim -E)를 대신 사용할 수 있습니다 ed. 그러나 ex다양한 구현에서는 줄을 연결할 때 공백을 삽입하는 반면 while은 그렇지 않습니다(따라서 인용된 문자열의 시작 부분에 공백을 추가할 필요가 없습니다). 해당 프로그램 및 기타 관련 프로그램은 동일한 기본 편집 명령을 구현하지만 다음과 같은 몇 가지 주요 미묘한 차이점이 있습니다.vied" $ruledeck"sedqed1965. 일부는 이러한 명령에 대한 중요한 확장도 제공합니다.

관련 정보