tkcon
과 같은 Tcl 쉘에서 명령을 실행하면 쉽게 어떤 문제가 있는지 알 수 있습니다. 도망 치지 말고 일리있는 일을 피하는 것이 좋습니다. 이하, (%
로 시작하는 라인이 결과 혼합한다. 명령
% set line {#define __VERSION_DAY 23}
#define __VERSION_DAY 23
set day 16
16
% set line [split $line]
{#define} __VERSION_DAY 23
리스트로 문자열을 분할 할 때, 캐릭터의 표현의 변화는 (가능 뒷부분 주위 따라서 괄호 #define
을리스트를 재생성 할 수 있도록 이는 기타) 잘못된 목록 항목이 될 것
set line [lreplace $line 2 $day]
{#define} __VERSION_DAY
lreplace
명령은 다음 인수를 취합니다. list
first
(인덱스) last
?element ...?
(0 개 이상의 요소 (인덱스)가 R 교체 와 함께). day
(16)의 내용은 아무 것도 대체하지 않을 범위의 마지막 색인으로 해석됩니다.
대신을 시도해보십시오
% set line [join [lreplace [split $line] 2 2 $day]]
#define __VERSION_DAY 16
파일에 날짜 필드를 업데이트 관련하여, 가장 좋은 건 아마 이런 식으로 어느 정도 그것을 할 :
set day 16
set f [open $filename]
set lines [split [string trim [read $f]] \n]
close $f
set result {}
set tag {#define __VERSION_DAY }
set pattern [string map {{ } *} $tag]
foreach line $lines {
if {[string match -nocase $pattern $line]} {
lappend result $tag$day
} else {
lappend result $line
}
}
set f [open $filename2 w]
puts -nonewline $f [join $result \n]
close $f
참고 : 그렇지 출력을 $result
은 변수의 내용이 목록 추가 행으로 작성된 목록 구조를 유지하기 위해 인용되기 때문에 직접 입력해야합니다. 개행 문자를 사용하여 행을 결합하면 구조가 출력에서 작동하는 평면 텍스트로 변경됩니다. Tcllib에서 fileutil
를 사용
또는, 전략은 기본적으로 동일하다는 것을
package require fileutil
set day 16
set tag {#define __VERSION_DAY }
set pattern [string map {{ } *} $tag]
set f [open $filename2 w]
::fileutil::foreachLine line $filename {
if {[string match -nocase $pattern $line]} {
puts $f $tag$day
} else {
puts $f $line
}
}
close $f
참고. 첫 번째 솔루션은 변수에 목록 추가 행을 사용하고 나중에 결합 된 텍스트를 인쇄합니다. 두 번째 솔루션 대신 각 줄을 직접 인쇄합니다. 하위 레벨 open
- read
- close
직접 인쇄를 사용하는 솔루션이나 fileutil
라인이있는 솔루션을 변수에 추가하는 것을 막을 수있는 방법은 없습니다.
문서 : close, fileutil (package), foreach, if, join, lappend, lreplace, open, package, puts, read, set, split, string
Tcl의 목록에 따르면 _also_는 결과가 유효한 단어가 아닌 첫 번째 단어에서 지정된 단일 명령을 _no_ 예기치 않은 대체와 함께 인수로 전달하는 유효한 스크립트임을 보증합니다 (백 슬래시와 중괄호의 최소 개수는 직렬화). 따옴표로 묶지 않으면 처음에 '#'이 해당 제약을 위반하게됩니다. –
Peter와 Donal의 상세한 답변을 보내 주셔서 감사합니다. – Stingray
피터 (Peter)의 첫 번째 제안을 시도했습니다. ... foreach line $ lines { if {[string string -nocase $ pattern $ line]} {...'날짜가 업데이트되고 정확한 위치에 ... 각 줄은 대괄호'{...} '안에 넣어집니다. 그리고 10 개의 라인은 하나의 긴 라인으로 끝납니다. – Stingray