여기에 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
.