1분기

1분기

저는 여기서 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합니다 (명령을 종료해야 함).writew

대신, 이는 행(최소한 하나를 포함하는 행 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이 플래그는 교체를 수행할 때만 사용됩니다. 이 명령 은 wsed 스크립트(사용 사례)에 따라 조건적으로 또는 무조건적으로 사용될 수 있습니다.

참고: 옵션 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즉시 다음 주기를 시작합니다. 따라서 키워드를 찾을 수 없으면 현재 행에 대해 다음 명령( , , )이 처리되지 않습니다.foxdogs///pw

관련 정보