如何回显在 Bash 脚本中使用 SED 命令删除了多少行?

如何回显在 Bash 脚本中使用 SED 命令删除了多少行?

如何编写一个 shell 脚本,它将计算并打印/回显执行 SED 命令时所做的更改数...

例如:让我们使用 SED 命令,删除与特定字符匹配的每一行。

sed '/@gmail.com/d' F1.txt > RESULT.txt

F1.txt文件包含:

[email protected]
[email protected]
[email protected]
[email protected]

该文件的输出为:

[email protected]
[email protected]

因此它匹配了两行并删除了这两行。

现在如何使用 Echo 在 Shell 脚本中回显此内容,提示此 SED 命令修改/删除了多少行?

它应该会发出声音并打印/回显,删除了 2 行。您能帮忙制作这个 shell 脚本吗?

#!/bin/bash
sed '/@gmail.com/d' F1.txt > RESULT.txt

答案1

如果您可以使用两个命令来执行此操作,则可以执行以下操作:

NUM_DELETIONS=$( grep "@gmail.com" F1.txt | wc -l )
sed '/@gmail.com/d' F1.txt > RESULT.txt

echo "${NUM_DELETIONS} lines were deleted from F1.txt"

如果你想把它写成一个快速而粗糙的bash脚本,你可能会考虑这样做:

#!/bin/bash

usage(){
    echo "$0 <source_file> <output_file> <removal_text>"
}

SOURCE_FILE="${1}"
OUTPUT_FILE="${2}"
REMOVAL_TEXT="${3}"

[[ ! -r "${SOURCE_FILE}" ]] && usage && exit 1
[[ -z "${REMOVAL_TEXT}" ]] && usage && exit 1

NUM_DELETIONS=$( grep "${REMOVAL_TEXT}" "${SOURCE_FILE}" | wc -l )
sed "/${REMOVAL_TEXT}/d" "${SOURCE_FILE}" > "${OUTPUT_FILE}"

echo "${NUM_DELETIONS} lines were deleted from "${SOURCE_FILE}""

答案2

以下是一种方法:

echo $(( $(wc -l < F1.txt) - $(wc -l < RESULT.txt) ))

wc -l是行数,并<使其从“标准输入”读取(这本质上是一种阻止其打印文件名的黑客攻击)

每个wc都包装在$()其中,只是在输出中替换。

$(( ... ))是 shell 算术(正如某人在评论中所说)。请注意中间的减号。

变量可能会使其更清晰;这是同一事物的另一个版本:

all=$(wc -l < F1.txt)
sed=$(wc -l < RESULT.txt)
echo $(($all - $sed))

相关内容