저는 여기서 sed를 배우고 있는데 여기에는 여러 명령이 있습니다.
(user@host)-(18:27:39)-(~/Bash_Programming)
$sed '4 { s/fox/elephant/; s/dog/cat/ }' catAndDog.txt
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown elephant jumps over the lazy cat
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
그러나 여러 명령을 사용하고 결과를 파일에 기록하려면 w 대체 플래그를 어디에 두어야 합니까?
w file = write the result of the substitution to a file
편집하다:
전체 출력을 변경 사항이 포함된 원본 파일의 복사본인 파일에 쓰고 싶습니다.
답변1
실제로는 있습니다.둘 w
요소. 하나는 명령이고 다른 하나는 표시입니다 s///
.
둘 다 익숙해쓰다파일에 대한 현재 패턴 공간입니다.
주문하다
예를 들어, 이 w
명령은 다음과 같이 작성 outfile
(복사본 만들기)합니다.
$ printf '%s\n' AA BB CC DD EE > infile
$ sed -n 'w outfile' infile
$ cat outfile
AA
BB
CC
DD
EE
이 -n
옵션은 패턴 공백을 인쇄하지 않지만 명령은 명령 뒤의 인수에 있는 파일 이름에 각 패턴(행)을 인쇄 w
합니다 (명령을 종료해야 함).write
w
대신, 이는 행(최소한 하나를 포함하는 행 C
)만 작성합니다.
$ sed -n '/C/ w outfile' infile ; cat outfile
CC
배너
다른 w
요소는 명령 w
에 대한 플래그 s///
이며 대략 같은 의미이지만 write
명령의 대체가 실행되는 경우에만 실행됩니다 s///
.
$ sed -n 's/C/X/w outfile' infile; cat outfile
XC
1분기
그러나 여러 명령을 사용하고 결과를 파일에 기록하려면 w 대체 플래그를 어디에 두어야 합니까?
교체 플래그는 (특정) 교체에 연결되어 있으므로 사용해야 하는 위치는 기록해야 하는 교체에 따라 다릅니다.
$ sed -n -e 's/B/X/w outfile' -e 's/D/Y/' infile; cat outfile
XB
-e
출력 파일 이름의 이름은 명령을 끝내거나(새 줄 필요) 다음과 같이 작성할 수 있으므로 각 대체는 별도(또는 별도의 줄)에 있어야 합니다 .
$ sed -n -e 's/B/X/w outfile
> s/D/Y/' infile; cat outfile
XB
다른 대체품을 사용할 수 있습니다.
$ sed -n -e 's/B/X/' -e 's/D/Y/w outfile' infile; cat outfile
YD
아니면 둘다:
$ sed -n -e 's/B/X/w outfile' -e 's/D/Y/w outfile' infile; cat outfile
XB
YD
또는 w
다음 명령을 사용하십시오(플래그 아님)(그리고 GNU sed를 가정):
$ sed -n 's/B/X/;s/D/Y/;w outfile' infile; cat outfile
AA
XB
CC
YD
EE
2분기
전체 출력을 변경 사항이 포함된 원본 파일의 복사본인 파일에 쓰고 싶습니다.
ㅏ치환로고를 쓸 수 없습니다.모두모든 줄을 바꾸지 않는 한 파일을 삭제하세요. w
다음 명령을 사용해야 합니다 (bash 가정).
$ printf 'The quick brown fox jumps over the lazy dog%.0s\n' {1..14} >catAndDog.txt
$ sed -n '4 { s/fox/elephant/ ; s/dog/cat/ } ; w outfile' catAndDog.txt
$ cat outfile
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown elephant jumps over the lazy cat
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
w
각 대체에 대한 플래그를 알면 각 대체에 대한 줄이 인쇄되므로 다음과 같은 일이 발생합니다.
$ sed -n -e '4 { s/fox/elephant/w outfile' -e 's/dog/cat/w outfile' -e '}' catAndDog.txt
$ cat outfile
The quick brown elephant jumps over the lazy dog
The quick brown elephant jumps over the lazy cat
답변2
응답:
전체 출력을 변경 사항이 포함된 원본 파일의 복사본인 파일에 쓰고 싶습니다.
다음과 같은 파일로 리디렉션할 수 있습니다.
sed '4{ s/fox/elephant/; s/dog/cat/}' infile > modified_file
또는 플래그를 사용하여 수정하세요 -i
.
sed -i '4{ s/fox/elephant/; s/dog/cat/}' infile
...또는 원본 파일에서 백업을 만들고 동일한 원본 파일 이름을 사용하여 변경 사항을 기록합니다.
sed -i.backup '4{ s/fox/elephant/; s/dog/cat/}' infile
또는 w
다음 명령을 사용하십시오.
sed '4{ s/fox/elephant/; s/dog/cat/ }; w modified_file' infile
성공한 줄을 바꾸는 명령 만 작성하려는 경우 s
(현재 요청한 내용이 아님) w
이 플래그를 사용하여 다음을 수행할 수 있습니다.
sed '4{ s/fox/elephant/; s/dog/cat/w modified_file
}' infile
답변3
그러나 여러 명령을 사용하고 결과를 파일에 기록하려면 w 대체 플래그를 어디에 두어야 합니까?
이 w
플래그는 개행 문자로 끝나거나 sed 스크립트(it 매개변수 포함)의 마지막 항목이어야 합니다. 공백, 주석, 세미콜론이 발견되면 파일 이름에 포함됩니다.
w
명령 대체 s
( )와 s///w
관련된 플래그와 명령을 혼동하지 마십시오 w
. 유사하지만 w
이 플래그는 교체를 수행할 때만 사용됩니다. 이 명령 은 w
sed 스크립트(사용 사례)에 따라 조건적으로 또는 무조건적으로 사용될 수 있습니다.
참고: 옵션 i
( --in-place
)은 POSIX에만 해당되지 않습니다.
첫 번째 예
prompt% sed -i.back -e "/$regex/w output" -e "/$regex/d" input
두 번째 예
prompt% sed -i.back "/$regex/ {
w output
d;}" input
누군가 귀하의 사건에 대해 질문을 할 수 있습니다.(아래 참조) 동일한 입력 라인에서 여러 대체가 수행되기 때문입니다.
prompt% sed -n '4 {
s/fox/wolf/w output
s/dog/bear/w output
}' input
입력의 한 줄만 수정되지만 출력 파일에는 두 줄이 포함됩니다.
The quick brown wolf jumps over the lazy dog
The quick brown wolf jumps over the lazy bear
이 결과는 오해의 소지가 있기 때문에 불편합니다.
전체 출력을 변경 사항이 포함된 원본 파일의 복사본인 파일에 쓰고 싶습니다.
내 솔루션을 사용하면 원본 파일의 백업을 생성하고( ) input.back
원본 파일에 변경 사항을 적용하고( input
) output
잠재적인 대체 항목을 다른 파일에 쓸 수 있습니다( ). 알고리즘은 w
명령을 사용합니다.
prompt% sed -i.back -nE '4!p # print line except 4th
4!d # delete line except 4th
/fox|dog/!p # print line if no "fox" or no "dog"
/fox|dog/!d # don't delete line if "fox" or "dog"
s/fox/wolf/ # substitution occurs if "fox"
s/dog/bear/ # substitution occurs if "dog"
p # if a substitution then print 4th line
w output' input # if a change then save 4th line in "output"
둘 다 발견되지 않거나 둘 다 발견되지 않으면 명령은 /fox|dog/!d
즉시 다음 주기를 시작합니다. 따라서 키워드를 찾을 수 없으면 현재 행에 대해 다음 명령( , , )이 처리되지 않습니다.fox
dog
s///
p
w