구성 파일에 이러한 종류의 줄이 있습니다.
bindsym $mod+F2 exec gnome-terminal #Open terminal bindsym $mod+p exec command /some/path" #Popup Dictionary bindsym $mod+Mod1+l exec --no-startup-id /some/path/command #Dmenu for my books collection bindsym Mod1+Control+b exec rxvt -e nnn #nnn file browser
두 번째 열과 #
뒤에있는 항목을 awk
하고 싶습니다. awk
를
awk "/bindsym/{print $2}" filename
로 사용하고 있습니다.
#
.
기본 출력은 키와 주석 텍스트입니다.
$mod+F2 Open terminal
Answer
$ awk -v OFS="\t" "/^bindsym/ { key = $2; sub(".*#", ""); print key, $0 }" file $mod+F2 Open terminal $mod+p Popup Dictionary $mod+Mod1+l Dmenu for my books collection Mod1+Control+b nnn file browser
여기서는 awk
를 사용하여 먼저 각 줄에서 두 번째 필드를 추출합니다. bindsym
로 시작하여 key
변수에 추가합니다. 그런 다음 줄에서 #
를 포함한 모든 항목을 삭제하고 key
및 줄의 나머지 부분을 다음과 같이 탭으로 인쇄합니다. 구분 기호.
대체 출력 형식 :
$ awk "/^bindsym/ { key = $2; sub(".*#", ""); printf("%-20s\t%-20s\n", key, $0) }" file $mod+F2 Open terminal $mod+p Popup Dictionary $mod+Mod1+l Dmenu for my books collection Mod1+Control+b nnn file browser
논리는 동일하지만 출력은 각각에 대해 20 자 ( 왼쪽 정렬) 필드와 그 사이에 탭을 넣습니다 (좋은 측정을 위해).
답변
iv #
에서 줄 끝까지 일치시키는 GNU awk
의 id = “b2b5f2c3bd”>
함수
p>
awk "/bindsym/ && match($0,/#(.+)$/,arr){print $2, arr[1]}" filep
match()
함수는 세 번째 인수에 제공된 배열을 두 번째 인수의 정규식에서 일치하는 패턴으로 채 웁니다. .
모든 POSIX awk
에서 match()
의 세 번째 인수는 지원되지 않습니다 . ,하지만 몇 가지 특수 변수 RSTART
및 RLENGTH
는 일치하는 그룹의 시작 및 길이 를 표시합니다. 현재 행에서 substr()
함수를 사용하여 일치하는 문자열을 가져옵니다.
awk "/bindsym/ && match($0,/#(.+)$/){print $2, substr($0,RSTART+1,RLENGTH)}" file
출력을 예쁘게 인쇄하려면 , 다른 답변과 마찬가지로 printf()
함수를 사용할 수 있습니다.
Answer
sed
에서 매우 간단합니다. 데이터가 실제로 필드 지향적이지 않기 때문에 Awk는 여기에서 큰 이점을 제공하지 않습니다.
sed "s/^[^ ]* //;s/ .*#//" inputfile
번역 :
s/^[^ ]* //
첫 번째 공백 문자를 포함하여 모든 항목을 삭제합니다.
s/ .*#//
첫 번째 (나머지) 공백 문자에서 모든 항목을 삭제합니다. 줄의 마지막 #
문자까지.
답변
Step1: count=`awk "{print NR}"|sed -n "$p" filename` Step2:for ((i=1;i<=$count;i++)); do awk -v i="$i" "NR==i && $0 ~ /^bindsym/{print $2}" filename; sed -n ""$i"s/.*#//p" filename; done| sed "N;s/\n/ /g" output for ((i=1;i<=$count;i++)); do awk -v i="$i" "NR==i && $0 ~ /^bindsym/{print $2}" filename; sed -n ""$i"s/.*#//p" filename; done| sed "N;s/\n/ /g" $mod+F2 Open terminal $mod+p Popup Dictionary $mod+Mod1+l Dmenu for my books collection Mod1+Control+b nnn file browser
댓글
- I ' m에 4 줄 이상이있을 수 있다고 가정합니다. 입력 파일. 터미널에 줄 번호를 인쇄하는 것 외에는 첫 번째 단계에서 수행 할 작업이 명확하지 않습니다.
- 코드 수정
- 코드 수정