다음과 같이 모든 짝수 행을 모든 홀수 행의 시작 부분으로 이동하는 방법을 알아내려고 합니다.
앞으로:
AAA
BBB
CCC
DDD
뒤쪽에:
BBBAAA
DDDCCC
여러 파일을 동시에 실행할 수 있다면 매우 좋을 것입니다. cat을 사용하여 모든 파일을 결합하면 파일이 너무 커서 처리할 수 없게 되기 때문입니다. bash 파일에 추가할 수 있도록 텍스트 교환을 수행하는 다음 명령과 같습니다.
find /directory/. -type f -exec sed -i 's/oldtext/newtext/g' {} \;
검색했지만 적합한 것을 찾지 못했습니다.
작업을 더 쉽게 하기 위해 다음과 같이 모든 홀수 줄의 시작 부분에 "string1"을 추가하고 모든 짝수 줄의 시작 부분에 "string2"를 추가할 수 있습니다.
before:
string1AAA
string2BBB
string1CCC
string2DDD
after:
string2BBBstring1AAA
string2DDDstring1CCC
매우 감사합니다.
답변1
접두사가 붙은 아이디어는 잊어버리세요. 당신이 찾고있는 스크립트는
sed 'N;s/\(.*\)\n\(.*\)/\2\1/'
즉, 를 사용하여 다음 줄을 읽은 N
다음 순서를 변경하고 줄 바꿈을 제거합니다.
find
작성한 내용과 결합 할 수 있습니다 . 먼저 옵션 없이 시도해 보고 -i
이것이 원하는 것인지 테스트해 보세요.
답변2
멍하니해결책:
for f in /directory/*; do gawk -i inplace '{getline nl; print nl$0}' "$f"; done
for f in /directory/*
- 지정된 경로의 각 파일에 대해
gawk -i inplace
- 할 수 있게 하다제자리에파일 편집
getline nl
- awk의 입력에서 변수로 다음 레코드를 읽습니다 nl
(다음 줄).
print nl$0
- 현재 및 다음 교환 기록 인쇄
답변3
GNU 사용 sed
:
sed '1~2 { h; d; }; G; s/\n//'
그리고 awk
:
awk '{ if(NR%2) save = $0; else print $0 save }'
그리고 perl
:
perl -pe '$_ = <> . $_; s/\n//'
답변4
eval "`echo 'NL=qsq' | tr 'qs' '\047\012'`"; # newline
set --
while IFS= read -r l; do
case $# in
0 ) set -- "$l" ;;
* ) printf '%s%s\n' "$l" "$1"; set -- ;;
esac
done < input.data
printf '%s' ${1+"$1$NL"} # to take care of dangling line
awk '{ if ( NR % 2 ) ORS = $0 RS; else print }' input.data
perl -lpe '$_ = (<>.$_) =~ s/\n//r' input.data
sed -ne '
${p;d;}
h;n;G;s/\n//p
' input.data
결과
BBBAAA
DDDCCC