我如何拆分“ABCD EFGH”为“ABCD”和“EFGH”?(How do I split “ab

2019-09-20 18:26发布

这实在是自我解释。 我在bash shell工作,我真正的新shell脚本。 我发现了很多有关使用trsed ,但到目前为止,我已经找到了所有的例子都删除分隔符和新的生产线。 我真正想要做的是相反的。 我希望能够基于一个空格分开。 我有一个像“ABCD EFGH”的字符串,我需要它是“ABCD”,“EFGH”(所有不带引号,只是为了显示分组)。

我敢肯定,这是简单得多比我做它,但我很困惑。

更新问题:

我有已投入的阵列的PID的一列,但所述阵列的每个元件具有两个在列的PID。

柱:

1234
5678

当我打印出整个阵列,所有不同的列都已经添加,所以我所有的值,但是当我打印出我的数组的一个元素,我得到这样的:

1234 5678

这不是我想要的。 我需要为1234和元素单独一个5678。

这是我到目前为止的代码:

!/bin/bash
echo "Enter the File Name"
read ips

index=0
IFS=' '
while read myaddr myname; do
    myips[$index]="$myaddr"
    names[$index]="$myname"
    index=$(($index+1))
done < $ips

echo "my IPs are: ${myips[*]}"
echo "the corresponding names are: ${names[*]}"
echo "Total IPs in the file: ${index}"

ind=0
for i in "$myips[@]}"
do
    echo $i
    pids=( $(jps | awk '{print $1}') )

    for pid in "${pids[@]}"; do
        echo $pid
    done

    echo "my PIDs are: ${pids}"

    for j in "${pids[@]}"
    do
        mypids[$ind]="$j"
        ind=$(($ind+1))
    done
done
echo "${mypids[*]}"
echo "The 3rd PID is: ${mypids[2]}"

输出示例:

Total IPs in the file: 6

xxx.xxx.xxx.xxx
5504
1268
1
xxx.xxx.xxx.xxx
5504
4352
1

xxx.xxx.xxx.xxx
5504
4340
1

5504
1268 5504
4352 5504
4340

The 3rd pid is: 5504
4340

我需要每个PID是分开的,使得数组的每个元素,是单个的PID。 因此,例如,行“第三pid是:”需要看起来像

The 3rd pid is: 5504

和第四要素将是4340

Answer 1:

尝试cut

$ echo "abcd efgh" | cut -d" " -f1
abcd

$ echo "abcd efgh" | cut -d" " -f2
efgh

另外,如果在某些时候你想要做更复杂的东西,你看看awk还有:

$ echo "abcd efgh" | awk '{print $1}'
abcd

$ echo "abcd efgh" | awk '{print $2}'
efgh

为了解决您的更新问题:

我有已投入的阵列的PID的一列,但所述阵列的每个元件具有两个在列的PID。

如果你想一列数据加载到一个数组,你可以这样做:

$ pgrep sshd  # example command. Get pid of all sshd processes
795
32046
32225

$ A=(`pgrep sshd`) # store output of command in array A

$ echo ${A[0]}  # print first value
795

$ echo ${A[1]}  # print second value
32046

为了解决您发布的示例代码,您的问题的原因是,你已经改变$IFS的空间( IFS=' '这意味着它们通过换行分隔的列不再被拆分。

考虑下面这个例子:

$ A=(`pgrep sshd`)
$ echo ${A[0]}  # works as expected
795

$ IFS=' '       # change IFS to space only
$ A=(`pgrep sshd`)  
$ echo ${A[0]}  # newlines no longer used as separator
795
32046
32225

为了避免这个问题,常用的方法是要始终备份原来的IFS和替换它一旦你使用更新后的值来完成。 例如

# backup original IFS
OLDIFS=$IFS

IFS=' '
# .. do stuff ...

# restore after use
IFS=$OLDIFS


Answer 2:

示例文件:

abcd efgh
bla blue

使用awk的,你可以做以下

cat file.txt | awk '{print $1}'

这将输出以下

abcd
bla

要么

cat file.txt | awk '{print $2}'

这将输出以下

efgh
blue

AWK是一个非常强大的命令,我建议你尝试,只要你可以了解它。 它会为您节省大量的头痛在bash脚本。



Answer 3:

其他解决方案都还不错。 我经常使用的切割。 不过,我只是想补充一点,如果你总是想拆就空白,然后xargs的会为你做的。 然后的printf的命令行版本可以格式化参数(如果串的重排序所需用途AWK如在其它溶液)。 下面是参考一个示例:

MYSTR="hello big world"
$ echo $MYSTR |xargs printf "%s : %s >  %s\n"
hello : big >  world


Answer 4:

所述read命令处理输入作为整个线(除非分隔符被设定为-e ):

$ echo "abcd efgh" | while read item
do
    echo $item
    # Do something with item
done

abcd efgh

如果你想管的每个项目的命令,你可以这样做:

echo "abcd efgh" | tr ' ' '\n' | while read item
do
    echo $item
    # Do something with item
done

abcd
efgh


Answer 5:

无需使用外部命令字符串分割成单词。 该set内建的做到了这一点:

string="abcd efgh"
set $string

# Now $1 is "abcd" and $2 is "efgh"
echo $1
echo $2


Answer 6:

还有就是串之间没有什么区别"abcd efgh"和字符串"abcd" "efgh"以外,如果作为参数传递给一个程序时,首先会被解读为一个参数,其中第二将是两个参数。

双引号"仅仅是激活和关闭外壳扩展,就像单引号做(更积极,虽然)。

现在,你可以有一个字符串'"abcd efgh"'你想变成'"abcd" "efgh"' ,你可以用做sed 's/ /" "/'但是这可能不是你想要的。



文章来源: How do I split “abcd efgh” into “abcd” and “efgh”?