bash를 사용하여 클라이언트 Seat_num을 늘리는 방법은 무엇입니까? 나는 이 파일을 가지고 있습니다 :
$ cat test
client1
name="", possition="", seat_num=""
client2
name="", possition="", seat_num=""
이 증분이 필요합니다.
client1
name="", possition="", seat_num="1"
client2
name="", possition="", seat_num="2"
이 접근 방식을 시도했지만 원하는 효과를 얻지 못했습니다.
$ while read -r line; do i=1;echo $line|sed -e 's/seat_num=""/seat_num="$i"/';((i++)); done <<< "$(grep -A 2 client test)"
client1
name="", possition="", seat_num="$i"
client2
name="", possition="", seat_num="$i"
답변1
사용 awk
:
awk 'BEGIN{FS=OFS="\""} /seat_num=/{$6=++n}1' test
FS=OFS="\""
입력 및 출력 필드 구분 기호를 로 설정합니다"
.seat_num=
연속해서 발견 되면 6번째 필드를 로 변경하세요++n
.var=++n
이는 먼저 증가한n
다음 설정함을 의미합니다var
. 대조적으로, 나중에var=n++
설정var
되고 증가됩니다. 의 정의되지 않은 변수awk
값은0
이므로++n
먼저 증가(--> )해야 합니다.
-i inplace
파일을 제자리에서 편집하려면 가능한 경우 사용할 수 있습니다 .
사용할 수 없는 경우 추가하세요.> test.tmp && mv test.tmp test
답변2
귀하의 질문에 "증분"(기존 숫자에 추가, 일반적으로 1 더하기)이 지정되어 있지만 다른 의견을 읽으면서 느낀 점은 파일의 클라이언트를 반복하고 " 클라이언트 "이후의 숫자"를 읽고 싶다는 것입니다. 줄을 만들고 다음 줄의 Seat_num을 같은 번호로 만듭니다.
이 경우 다음 sed 명령이 저에게 효과적이었습니다. 여기서 test 내용은 질문과 동일합니다. (이 작업을 수행하는 다른 방법이 많이 있을 것이라고 확신합니다):
sed 'H;1h;$!d;x; s/client\([0-9]*\)\(\n[^\n]*\)seat_num=""/client\1\2seat_num="\1"/g' <<< cat test
이것은 @Wiktor Stribizew의 답변에 있는 마법 문자열로 시작됩니다.이 문제: "( H;1h;$!d;x;
파일을 메모리에 넣습니다)". 매뉴얼 페이지를 읽으면 입력에서 읽은 패턴 줄을 "보류 공간"으로 복사한 다음 패턴을 제거하고 입력이 끝날 때까지 입력에서 다른 패턴 줄을 읽은 다음 "보류 공간"을 다시 "패턴 공간"은 다음 교체를 실행할 준비가 되어 있습니다. 그러나 아직 세부 사항이 확실하지 않으므로 기꺼이 수정하겠습니다.
client
대신에 0개 이상의 숫자( [0-9]*
) 가 오는 문자열을 찾고 이스케이프된 대괄호를 사용하여 숫자를 기억합니다 \(
. \)
그런 다음 개행 문자를 찾고 그 뒤에 개행 문자가 아닌 0개 이상의 문자(다음 문자만 읽을 수 있도록 seat_num
)를 찾은 다음 다음 문자를 찾습니다. seat_num=""
다시 이스케이프 괄호를 사용하여 이전에 나온 문자를 기억합니다 seat_num=
.
client
우리는 그것들을 모두 원본 텍스트와 기억된 숫자(첫 번째 기억된 인수 사용), \1
두 번째 기억된 인수, 그런 다음 seat_num="
원본 텍스트의 반복과 첫 번째 기억된 인수(다음 숫자) client
및 마지막 "
. 이제 패턴에 전체 파일이 포함되므로 이 g
명령을 사용하여 전역적으로 교체를 수행합니다.
답변3
seat_num
시작 1
.
당신은 시도 할 수 있습니다:
i=1
while IFS= read -r line; do
if grep -Fq 'seat_num=""' <<< "$line"; then
sed "s/seat_num=\"\"/seat_num=\"$((i++))\"/" <<< "$line"
else
printf '%s\n' "$line"
fi
done <<< "$(grep -A 2 client test)"
산출:
client1
name="", possition="", seat_num="1"
client2
name="", possition="", seat_num="2"
i
행에 가 포함된 경우 증가합니다 seat_num=""
.