다음과 같은 파일이 있습니다
$ cat IP
10.3.1.1
10.4.1.1
10.6.3.1
10.19.4.2
10.22.3.4
어떻게 하면 다음과 같이 만들 수 있나요?
$ cat IP
10.3.1.1, 10.4.1.1, 10.6.3.1, 10.19.4.2, 10.22.3.4
답변1
그리고 perl
:
perl -pe 's/\n/, / unless eof' IP
-i
nplace.txt 파일을 편집 하는 옵션이 추가되었습니다 i
. 또는 -i.orig
제자리에서 편집하되 원본 콘텐츠를 IP.orig
.
셸을 사용하면 zsh
다음을 사용하여 이러한 IP를 배열에 로드할 수도 있습니다.
ips=( ${(f)"$(<IP)"} )
그런 다음 j
쉼표로 다시 작성하십시오.
print -r -- ${(j[, ])ips} > IP
한 번에 한 줄씩 처리하는 Perl과 달리 Perl은 전체 파일을 메모리에 로드합니다.
다른 두 가지 차이점:
- 빈 줄은 버려집니다.
- 원본 파일에 빈 파일이 없거나 마지막 줄이 적절하게 구분되지 않은 파일이 있더라도 줄바꿈 문자는 항상 끝에 추가됩니다.
답변2
GNU를 통해 구현됨 sed
:
sed -z 's/\n*$//;s/\n/, /g;s/$/\n/' IP
답변3
아마도
perl -e 'print join(", ", map { chomp; $_ } <>), "\n"' IP
또는
awk '{ printf "%s%s", c, $0; c = ", " } END { print "" }' IP
또는 빠르고 더러운 해킹을 수행하고 파일의 줄 수(아마도 8000개만)로 제한하고 이것이 xargs
실제로 이것을 위해 설계되지 않았다는 것을 기억하십시오
xargs <IP | sed 's/ /, /g'
이들 모두는 예제 데이터 세트에서 동일한 출력을 생성합니다.
10.3.1.1, 10.4.1.1, 10.6.3.1, 10.19.4.2, 10.22.3.4
그런 다음 해당 출력을 임시 파일로 리디렉션한 다음 원본 파일을 덮어쓸 수 있습니다. 여기에서 command_from_above
변경 사항을 작성하기 위해 선택한 명령으로 바꾸십시오(이 답변 또는 다른 사람이 여기에 있음).표준 출력원본 파일 대신:
command_from_above >"IP.$$.tmp" && mv -f -- "IP.$$.tmp" IP
rm -f -- "IP.$$.tmp"
답변4
awk를 사용하세요:
awk '{printf "%s%s", (NR==1) ? "" : ", ", $0}END{print ""}'
이렇게 하면 첫 번째 줄을 제외한 모든 줄에 쉼표 접두사가 추가됩니다.