sed를 사용하여 b 전에 a를 버블링합니다.

sed를 사용하여 b 전에 a를 버블링합니다.

a와 b만 포함된 파일이 있습니다.

aaaaaaaaaaaaaabbbbbb
abababaaaabbbaabababa
bbbbbaaaaaa
aaabbbabbbaaaabbaba
abababbabbababbbabbab
abababbababaabaaabbababbaba
bababbbababba

나는 다음과 같이 sed를 사용하여 b 앞에 모든 a를 정렬하고 싶습니다.

    aaaaaaaaaaaaaabbbbbb
    aaaaaaaaaaaabbbbbbbbb
    aaaaaabbbbb
    aaaaaaaaaabbbbbbbbb
    aaaaaaaabbbbbbbbbbbbb
    ...

이 스크립트를 작성하려고 합니다.

for row in $(sed -n 'p' $1)
do
    for k in $(seq $((${#row}-2)))
    do
        for j in $(seq $((${#row}-k-1)))
        do
           if [[  "${row:$j:1}" == a  &&  "${row:$j+1:1}" == b ]]; then
               sed -e  "s/./a/$j+1/p" $row  >> out.txt
           fi
        done
    done
done

그러나 그것은 작동하지 않으며 실제로 작동하게 만드는 방법을 모릅니다. 하지만 이 스크립트를 작성한 후에는 sed 태그를 사용하는 것이 더 쉬울 수도 있다는 것을 깨달았습니다.

하지만 "a"가 "b" 앞에 있는지 확인하기 위해 sed에서 테스트 조건을 설정하는 방법이나 sed에서 루프 수를 설정하는 방법은 무엇입니까?

답변1

test.txt라는 파일을 만들고 다음 명령을 실행했습니다.

sed -e ':loop' -e 's/ba/ab/' -e 't loop' test.txt

답변2

약간 더 효율적인 접근 방식 sed:

sed 'h; s/b//g; x; s/a//g; H; x; s/\n//' file.txt

그리고 perl:

perl -lpe '$_ = y/b//dr . y/a//dr' file.txt

또 다른 방법 perl:

perl -lpe '$_ = join "", sort split //' file.txt

(이것은 "a" lt "b") 때문에 작동합니다.

GNU 사용 awk:

awk '{ print gensub(/b/, "", "g") gensub(/a/, "", "g") }' file.txt

그리고 bash:

while read -r line; do
    printf '%s%s\n' "$( tr -d b <<<"$line" )"  "$( tr -d a <<<"$line" )"
done <file.txt

답변3

if [[  "${row:$j:1}" == a ...

이 작업을 수행하려면 셸에서 모든 작업을 수행할 수 있다고 생각합니다.

while read -r s ; do
    for (( i = 0 ; i < ${#s} ; i++ )) ; do 
        [ "${s:i:1}" = "a" ] && astr+=a || bstr+=b
    done
    echo "$astr$bstr"
done

답변4

perl -pe 's/(b+)(a+)/$2$1/ while /ba/'  data.file

레코드에 "b"와 "a"가 포함되어 있는 한 현재 레코드에서 Bee와 Ace의 "섬"을 계속 뒤집을 것입니다.

perl -F\(b+\) -lne '
   my @A;
   splice @A, (/b/ ? @A : 0), 0, $_  for @F;
   print @A;
' data.file

읽은 각 레코드/행에 대해 @A 배열을 초기화합니다. 레코드에서 잘라낸 필드(@F에 저장됨)를 확인하고 "b"가 포함되어 있으면 배열의 끝으로 푸시하고, 그렇지 않으면 시작 부분에 배치합니다. 마지막으로 배열을 인쇄합니다.

관련 정보