![sed를 사용하여 b 전에 a를 버블링합니다.](https://linux55.com/image/111371/sed%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20b%20%EC%A0%84%EC%97%90%20a%EB%A5%BC%20%EB%B2%84%EB%B8%94%EB%A7%81%ED%95%A9%EB%8B%88%EB%8B%A4..png)
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"가 포함되어 있으면 배열의 끝으로 푸시하고, 그렇지 않으면 시작 부분에 배치합니다. 마지막으로 배열을 인쇄합니다.