Awk 使用流编辑器删除行

Awk 使用流编辑器删除行,awk,sed,Awk,Sed,从文本中删除某些行时出现问题 这是文件的输出: # SHA512 HASH 96896c1b0b52047fac3cdcfea7b15c3eca7fcc53ee3294000493d4421df61e7947cdcaed783edc95e8ba51fbed164f383fc09afdb73587e590e08eef08086a4d stage3-amd64-nomultilib-20160310.tar.bz2 # WHIRLPOOL HASH e5e15b81753c6f1dd1886c25

从文本中删除某些行时出现问题

这是文件的输出:

# SHA512 HASH
96896c1b0b52047fac3cdcfea7b15c3eca7fcc53ee3294000493d4421df61e7947cdcaed783edc95e8ba51fbed164f383fc09afdb73587e590e08eef08086a4d  stage3-amd64-nomultilib-20160310.tar.bz2
# WHIRLPOOL HASH
e5e15b81753c6f1dd1886c2567b0012bfd822746d8ddce32ddf6e41f64074b4cb9c49dce787ea4cb160ce1234e0a8ba1d3a66b3904a2fb5500c435dd0fc69fea  stage3-amd64-nomultilib-20160310.tar.bz2
# SHA512 HASH
35735f8c7533bf6cda384a015e3eaac61b89e832f181c49332b04c07cbd3dfe7a61d5c5dce7c1e4155880b2a4e690839efcd914f04523b2a0e1e903749be6192  stage3-amd64-nomultilib-20160310.tar.bz2.CONTENTS# WHIRLPOOL HASH
c04c4d0f677c0e035262632e4fd03d71a786019b94a0ca0565a6c1af51a9103315e3da030d7c0f071ee729543f9b5d591757e43fad6ee66ff5dff88968eb8d2c  stage3-amd64-nomultilib-20160310.tar.bz2.CONTENTS
我的任务是删除行内容,删除WHIRLPOOL哈希,并验证剩余的SHA-512摘要,因为我知道我需要在需要删除的每一行中添加#,我认为可以使用sed或awk来完成

所需输出为:

# SHA512 HASH
96896c1b0b52047fac3cdcfea7b15c3eca7fcc53ee3294000493d4421df61e7947cdcaed783edc95e8ba51fbed164f383fc09afdb73587e590e08eef08086a4d  stage3-amd64-nomultilib-20160310.tar.bz2
# WHIRLPOOL HASH
#e5e15b81753c6f1dd1886c2567b0012bfd822746d8ddce32ddf6e41f64074b4cb9c49dce787ea4cb160ce1234e0a8ba1d3a66b3904a2fb5500c435dd0fc69fea  stage3-amd64-nomultilib-20160310.tar.bz2
# SHA512 HASH
#35735f8c7533bf6cda384a015e3eaac61b89e832f181c49332b04c07cbd3dfe7a61d5c5dce7c1e4155880b2a4e690839efcd914f04523b2a0e1e903749be6192  stage3-amd64-nomultilib-20160310.tar.bz2.CONTENTS# WHIRLPOOL HASH
c04c4d0f677c0e035262632e4fd03d71a786019b94a0ca0565a6c1af51a9103315e3da030d7c0f071ee729543f9b5d591757e43fad6ee66ff5dff88968eb8d2c  stage3-amd64-nomultilib-20160310.tar.bz2.CONTENTS

谢谢

我不知道如何在
sed
awk
中实现这一点,但我快速编写了一个肮脏的Python脚本供您尝试。此脚本不会更改原始文件。它将创建final.yourfilename,然后可以重命名它。您必须根据您的用例调整脚本

tests.py(将其保存在与SHAs文件相同的目录中)

使用您的文件,结果将是:

python tests.py

# SHA512 HASH
96896c1b0b52047fac3cdcfea7b15c3eca7fcc53ee3294000493d4421df61e7947cdcaed783edc95e8ba51fbed164f383fc09afdb73587e590e08eef08086a4d  stage3-amd64-nomultilib-20160310.tar.bz2
# WHIRLPOOL HASH
#e5e15b81753c6f1dd1886c2567b0012bfd822746d8ddce32ddf6e41f64074b4cb9c49dce787ea4cb160ce1234e0a8ba1d3a66b3904a2fb5500c435dd0fc69fea  stage3-amd64-nomultilib-20160310.tar.bz2
# SHA512 HASH
#35735f8c7533bf6cda384a015e3eaac61b89e832f181c49332b04c07cbd3dfe7a61d5c5dce7c1e4155880b2a4e690839efcd914f04523b2a0e1e903749be6192  stage3-amd64-nomultilib-20160310.tar.bz2.CONTENTS# WHIRLPOOL HASH
c04c4d0f677c0e035262632e4fd03d71a786019b94a0ca0565a6c1af51a9103315e3da030d7c0f071ee729543f9b5d591757e43fad6ee66ff5dff88968eb8d2c  stage3-amd64-nomultilib-20160310.tar.bz2.CONTENTS
使用bash脚本

测试。sh

#!/bin/bash

file='tests.txt' # this is your original file
shas_to_comment=()

while read -r line; do
    if [[ $line == *".CONTENTS#"* ]]; then
        hashline=$(echo $line | awk -F '.CONTENTS' '{print $2}')
        shas_to_comment=("${shas_to_comment[@]}" "$hashline")
    fi
done < $file

comment_next_line=0
while read -r line; do
    for item in "${shas_to_comment[@]}"; do

        if [[ $comment_next_line -eq 1 ]]; then
            echo "#$line"
            comment_next_line=0
            continue
        fi

        if [[ $line == *".CONTENTS${item}"* ]]; then
            echo "#$line"
            continue
        fi

        echo $line

        if [[ $line == $item ]]; then
            comment_next_line=1
        fi

    done
done < $file

您能包括所需的输出吗?这与GnuPG有什么关系?无论如何,这似乎不是一个实际的开发问题,更多的是关于一般计算机的使用,这在堆栈溢出上是离题的。在我对DIGESTS.asc文件使用gpg后,会生成一个新的文件DIGESTS,我发布的是它的内容。你确定这是你的准确输入吗?
#WHIRLPOOL HASH
真的在最后一行的末尾,而不是在它自己的行上吗?它在它自己的行上。我只需要使用shell脚本就可以了。还有其他限制吗?例如,你只需要使用awk、sed或cut之类的吗?@Maximtoyberman-添加了一个脚本,我希望它对你很有效。您可能需要根据您的具体用途对其进行调整case@Maximtoyberman-这个答案对你有帮助吗?如果是这样的话,请通过标记接受来结束您的问题。请随时等待更多答案
#!/bin/bash

file='tests.txt' # this is your original file
shas_to_comment=()

while read -r line; do
    if [[ $line == *".CONTENTS#"* ]]; then
        hashline=$(echo $line | awk -F '.CONTENTS' '{print $2}')
        shas_to_comment=("${shas_to_comment[@]}" "$hashline")
    fi
done < $file

comment_next_line=0
while read -r line; do
    for item in "${shas_to_comment[@]}"; do

        if [[ $comment_next_line -eq 1 ]]; then
            echo "#$line"
            comment_next_line=0
            continue
        fi

        if [[ $line == *".CONTENTS${item}"* ]]; then
            echo "#$line"
            continue
        fi

        echo $line

        if [[ $line == $item ]]; then
            comment_next_line=1
        fi

    done
done < $file
# SHA512 HASH
96896c1b0b52047fac3cdcfea7b15c3eca7fcc53ee3294000493d4421df61e7947cdcaed783edc95e8ba51fbed164f383fc09afdb73587e590e08eef08086a4d stage3-amd64-nomultilib-20160310.tar.bz2
# WHIRLPOOL HASH
#e5e15b81753c6f1dd1886c2567b0012bfd822746d8ddce32ddf6e41f64074b4cb9c49dce787ea4cb160ce1234e0a8ba1d3a66b3904a2fb5500c435dd0fc69fea  stage3-amd64-nomultilib-20160310.tar.bz2
# SHA512 HASH
#35735f8c7533bf6cda384a015e3eaac61b89e832f181c49332b04c07cbd3dfe7a61d5c5dce7c1e4155880b2a4e690839efcd914f04523b2a0e1e903749be6192  stage3-amd64-nomultilib-20160310.tar.bz2.CONTENTS# WHIRLPOOL HASH
c04c4d0f677c0e035262632e4fd03d71a786019b94a0ca0565a6c1af51a9103315e3da030d7c0f071ee729543f9b5d591757e43fad6ee66ff5dff88968eb8d2c stage3-amd64-nomultilib-20160310.tar.bz2.CONTENTS