본문에서Sed - 파일에서 단어의 처음 k 인스턴스 바꾸기, 사용자 제안:
sed 's/old/new/;s/old/new/;s/old/new/;s/old/new/;s/old/new/' filename
한 줄에 있는 단어의 처음 k 인스턴스를 바꾸는 방법입니다. 이는 이전 상위 k 인스턴스를 새 인스턴스로 교체하는 문제에 대한 우아하지 않은 솔루션처럼 보입니다. 말하는 방법, 다른 일을 하는 방법도 있습니다. 그러나 sed를 사용하여 한 줄에서 처음 k개의 단어를 바꾸는 문제에 대한 다른(또는 다른 우아한) 해결책은 없습니다.
수석/의사:
나는 추적하고 싶은 모든 종류의 이상한 작은 것들에 정말 도움이 되는 "슬러그"라고 부르는 많은 항목을 가지고 있습니다. 그것들은 다음과 같습니다:
#slug YYYY/MM/DD d hhmm field1 field2 field3 notes
나는 그것들을 일련의 날짜가 있는 문서에 보관합니다. 그런 다음 grep | sed | awk 체인을 통해 파일을 넣어 데이터에서 보고서를 생성합니다. 이웃집 개가 짖어서 밤에 나를 깨운다고 가정해 봅시다. 개가 짖는 소리가 들릴 때마다 시간을 기록하고 이를 로그 파일에 기록합니다.
#bark 2016/04/06 W 0214 0232 Police showed up!
잠시 후 데이터베이스를 저장하고 보름달에 개가 짖는 것과 같은 몇 가지 추세를 알아차리길 바랍니다. 애플릿 체인은 다음과 같습니다:
grep "^#[Bb][Aa]" 2014* 2015* 2016* |\
sed 's/ /|/;s/ /|/;s/ /|/;s/ /|/;s/ /|/' |\
awk {something or other} >\
barking-dog-report
그래서 제 질문은 sed 부분입니다.
sed 's/ /|/;s/ /|/;s/ /|/;s/ /|/;s/ /|/'
이는 여기서 "처음 5개의 공백을 파이프로 대체"하는 것으로 해석됩니다. awk에서 필드 구분자로 파이프를 사용하고 있습니다. 이와 같은 명령은 s/ /|/5
작동하지 않으며 단지 각 줄의 다섯 번째 공백을 파이프로 변경합니다. 나는 이 일련의 sed 명령이 우스꽝스러워 보인다고 생각합니다. s/ /|/g
공백을 필드 구분 기호로 사용하는 대신 주석 섹션에서 공백으로 유지하고 싶기 때문에 전역 대체가 아닙니다 .
답변1
5개의 명령을 하나로 결합할 수 있습니다 sed
(그러나 그렇다고 해서 더 짧아지는 것은 아닙니다).
sed 's/^\([^ ]*\) \([^ ]*\) \([^ ]*\) \([^ ]*\) \([^ ]*\) \(.*\)/\1|\2|\3|\4|\5|\6/'
그러나 grep
검색을 스크립트에 넣어 sed
쉘 명령을 1만큼 줄일 수 있습니다(여기서는 원래 대체 명령이 사용됨).
sed -n '/^#[Aa][Bb]/{s/ /|/;s/ /|/;s/ /|/;s/ /|/;s/ /|/;p;}' files |\
awk '...' > report