如何编写一个 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))