我try 使用命令sedawk,以及定义为Bash脚本的任意函数(或命令).例如,下面的Bash脚本prepend_largest_prime.sh接受一个字符串作为其第一个参数,并输出N以下较大的素数,其中N是该字符串的长度:

#!/bin/bash

is_prime() {
# Returns 1 if a number is prime, 0 if not
    i=2
    if [ $1 -lt 2 ]
    then
        return 0
    fi
    
    max=`echo "sqrt($1)" | bc`
    while [ $i -le $max ]
    do
        if [ `expr $1 % $i` -eq 0 ]
        then
            return 0
        fi
        i=`expr $i + 1`
    done
    
    return 1
}

largest_prime_under() {
    counter=$1
    is_prime $counter 
    counter_primeQ=$?

    if [[ $counter_primeQ = 1 ]]; then
        echo $counter
        exit 1
    fi
    counter=$[ $counter - 1 ]

    while [[ $counter -gt 0 ]] ; do
        is_prime $counter
        counter_primeQ=$?
        if [[ $counter_primeQ = 1 ]]; then
            echo "$counter"
            exit 1
        fi
        counter=$[ $counter - 1 ]
    done
}

string_length() {
    str="$1"
    n=${#str}
    echo "$n"
}

string_length_num=$(string_length "$1")
largest_prime_under_string=$(largest_prime_under $string_length_num)

echo $largest_prime_under_string $1

此脚本的示例调用可以是:

$ ./prepend_largest_prime.sh 'The quick brown fox jumps over the lazy dog.'
43 The quick brown fox jumps over the lazy dog.

这里传递的字符串有44个字符,44以下较大的素数是43.

这就是我所能做的一切.它仍然不起作用,对手头的任务来说似乎太复杂了:

cat input_file.txt
The majestic mountains towered over the quaint little beautiful village below.
The serene garden is colorful.
The old oak trees stood tall, their branches reaching towards the sky.
$ sed "s|.*|\"\$(\./prepend_largest_prime.sh '&')\"|" input_file.txt
"$(./prepend_largest_prime.sh 'The majestic mountains towered over the quaint little beautiful village below.')"
"$(./prepend_largest_prime.sh 'The serene garden is colorful.')"
"$(./prepend_largest_prime.sh 'The old oak trees stood tall, their branches reaching towards the sky.')"

对于本例,我要查找的命令的输出应该是

73 The majestic mountains towered over the quaint little beautiful village below.
29 The serene garden is colorful.
67 The old oak trees stood tall, their branches reaching towards the sky.

我怎样才能做到这一点呢? 谢谢!

推荐答案

初步:以下所有条件都假定数据每行显示一项,没有嵌入换行符,并且换行符之间的所有字符都是重要的.

我try 使用命令sedawk,以及定义为Bash脚本的任意函数(或命令).

太尴尬了,我不是故意双关语.正如 comments 中所描述的,您所描述的内容更适合于shell .或者,xargs专门用于将输入转换为命令的参数,如您所愿:

xargs -d '\n' -n1 ./prepend_largest_prime.sh < input.txt

如果你开着它通过awksed,那么你确实有 Select .POSIX没有定义sed可以执行外部命令的方法,但是如果您可以依赖GNU sed提供的扩展,那么它的e命令就可以使用.您可以将输入行编辑为要执行的命令,然后使用e执行它:

sed "s,^\(.*\)\$,./prepend_largest_prime.sh '\1',; e" input.txt

还有其他处理细节的方法,但这种方法使用s命令将输入行括在单引号中,并在前面加上要执行的命令的名称.请注意,如果输入包含单引号,它将中断,尽管您可以稍微多做一些工作来适应这一点.

awk版本更标准,也更容易阅读,使用的是system()功能,但其理念基本相同.将每一行输入编辑到您想要执行的shell 命令中,并将结果传递给system():

awk '{ system("./doit.sh '"'"'" $0 "'"'"'") }' < input.txt

与基于sed的方法一样,您需要做更多的工作来适应包含单引号字符的输入.

Linux相关问答推荐

Bash脚本用于在远程工作后关闭用户会话

BASH-SCRIPT-在特定行合并两个文件

如何修复 script(1) 实用程序输出的换行符?

重新运行时避免 Linux bash 脚本中的文件重命名重复

如何过滤 Bash 的正则表达式(Linux)中的所有值,除了一个?

如何验证所有 csv 文件是否具有相同的第一行?

为什么控制台不接受反向换行?

使用 sed 或 awk 在 linux 中将第一行中的一个单词替换为第二行中的另一个单词

如何在守护进程中使用 popen() 和 pclose() 获取通过管道执行的 shell 命令的正确退出代码?

sig_atomic_t 实际上是如何工作的?

如何排除 tar 的绝对路径?

如何在 UNIX 上的 $PATH 中转义冒号 (:)?

对一行的最后一个字段进行排序

Mac OS X 中的 ldconfig 等效项?

如何在没有空格的情况下打印 awk?

bash中变量名后的2个逗号是什么意思?

rename() 是原子的吗?

在Linux中使用空格设置环境变量

readelf vs. objdump:为什么都需要

在tmux中绑定Ctrl+Tab和Ctrl+Shift+Tab