각 줄에 특정 단어 추가

각 줄에 특정 단어 추가

여기에 file.txt와 같은 파일이 있습니다.

bbb-ccc-cccc#
   aasdf  asdas asdasa fgdg
   asdfa  asfdas  adfaq  asfa
   afdaf  fafa  fafd  afafa
bbb-ccc-cccc#

#다음으로 끝나는 단어를 가져와 각 줄의 첫 번째 단어로 추가하고 싶습니다 .

sed 's/bbb-ccc-cccc#/^/' < file.txt > newfile.txt

# 기호 앞의 단어를 미리 모르기 때문에 내 요점은 로 끝나는 단어를 찾아 #각 줄의 시작 부분에 넣는 것입니다. 이 file.txt에는 다음과 같은 것이 필요합니다.

bbb-ccc-cccc#
bbb-ccc-cccc#   aasdf  asdas asdasa fgdg
bbb-ccc-cccc#   asdfa  asfdas  adfaq  asfa
bbb-ccc-cccc#   afdaf  fafa  fafd  afafa
bbb-ccc-cccc#

답변1

그리고 perl:

perl -lpe 'if (/\H+#/) {$word = $&} else {$_ = $word . $_}'

즉, 한 줄에서 공백이 아닌 문자( \H+) 뒤에 a가 오는 경우 해당 시퀀스(정규식과 일치하는 항목)를 다음 줄의 시작 부분에 삽입할 단어로 사용합니다.#$&

awk같은

awk '
  match($0, /[^[:blank:]]+#/) {
    word = substr($0, RSTART, RLENGTH)
    print
    next
  }
  {print word $0}'

sed(사용 하여예비 공간저장하다단어):

sed '
  /[^[:blank:]]\{1,\}#/ {
    h; # save the line in the hold space
    s//\
&\
/; # put newlines on each side of the matched word
    s/.*\n\(.*\)\n/\1/; # remove every thing but the word
    x; # swap hold and pattern space so that now the hold
       # space contains the word. And branch off:
    b
  }
  # for the other lines:
  G; # append the hold space to the pattern space
  s/\(.*\)\n\(.*\)/\2\1/; # move the word to the beginning'

word#줄 끝에서만 s를 일치시키려면 위의 3개 명령을 모두 with로 바꾸세요 #.#$

답변2

사용 awk:

$ awk '/^[^ ]*#$/ { prefix = $0; print; next } { print prefix, $0 }' file
bbb-ccc-cccc#
bbb-ccc-cccc#    aasdf  asdas asdasa fgdg
bbb-ccc-cccc#    asdfa  asfdas  adfaq  asfa
bbb-ccc-cccc#    afdaf  fafa  fafd  afafa
bbb-ccc-cccc#

그러면 접두사가 있는 모든 줄이 인쇄됩니다. 접두사는 패턴과 일치하는 모든 줄 ^[^␣]*#$, 즉 공백이 아닌 문자로만 완전히 구성되고 로 끝나는 줄 에서 가져옵니다 #. 이 행은 접두어가 첨부되지 않은 상태로 인쇄되며 다음 입력 행에서 처리가 계속됩니다.

답변3

이것이 내 솔루션입니다 gnu sed.

sed '/\(.*\)#/{h;:y;n;/\(.*\)#/b;G;s/\(.*\)\n\(.*\)/\2\1/;by}' test.txt

빠른 설명:

  • h는 현재 버퍼를 "예약된 공간"에 복사합니다.
  • G는 현재 버퍼에 "예약된 공간"을 추가합니다(제거해야 하는 캐리 리턴을 추가합니다).
  • :xxx는 라벨입니다.
  • bxxx는 고토입니다. "b"만 스크립트 끝에 도달함
  • n 현재 버퍼를 인쇄하고 다음 줄을 읽습니다.

내 bash 솔루션은 다음과 같습니다.

while IFS='' read -r x;do if [[ "$x" = *# ]] ; then if [ "$p" = "$x" ]; then p=''; else p="$x"; x=''; fi ; fi; printf '%s%s\n' "$p" "$x";done < test.txt

답변4

배쉬에서:

#!/bin/bash

# grab one of the lines ending in #
prefix=$(egrep '#$' file | head -1)

cat file | while read line
do
    # if the line ends in a #, just print it
    if [[ $line =~ \#$ ]]
    then
        echo $line
    else
        # print the line prefixed with the $prefix
        printf -- "%s %s\n" "$prefix" "$line"
    fi
done

[[ $line =~ \#$ ]]는 정규 표현식 if 문입니다 egrep. 쉘이 마음에 들지 않으면 로 바꿀 수 있습니다 if egrep -q '#$' <<< line; then.

관련 정보