• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] TAB bzw Hashtag mit sed entfernen?

oelk

Member
Hallo,

mal wieder so'n Ding.

Ich hätte da eine smb.conf mit
Code:
#       acl allow execute alway = yes

Nach dem '#' kommt ein TAB.
Krieg ich das mit sed raus, in einem shellscript?
In dieser Datei kommen noch mehr Hashtags vor.
Ziel wäre ein 'acl allow execute alway = yes' ohne Hashtag.

MfG
 
OP
O

oelk

Member
Wer lange genug sucht, der findet.

Ich hätte da einen Vorschlag:
Code:
cat smb.conf.w7 | tr "\t" " " | tr -s " " smb.conf.w7 > tempfile && cat tempfile > smb.conf.w7
sed -i s/\#\ acl/\ acl/g smb.conf.w7

Funktionierte erst mal.

Geht's besser?
Da sind dann halt alle TABs weg und durch einen blank ersetzt.

MfG
 

abgdf

Guru
Code:
awk -F "#\t" '{print $2}' smb.conf
Das macht das aber mit allen Zeilen, die "#\t" (also "#" und den Tabulator) enthalten. Das heißt, es zerteilt die Zeilen bei "#\t" und gibt aus, was hinter dem "#\t" in der Zeile ist. Für die ganze Datei.
 
@halo44,

und was ist wenn seine Einträge auch per Tab getrennt sind? Whitespaces sind immer sehr haarig zu beurteilen von daher immer so genau wie möglich arbeiten.
 
OP
O

oelk

Member
Hallo Geier0815,

die Tabs sind nur am Zeilenanfang, so war das Original von openSUSE.
Ich beging leider den Fehler, das weiter zu führen anstatt die Tabs gleich durch Leerzeichen zu ersetzen.

Schön wäre gewesen den Hashtag nur in der angesprochenen Zeile zu entfernen,
scheint aber nicht möglich. Insofern werde ich die Variante in meinem 2. Posting
verwenden.

MfG
 
Meine Antwort war auch nur an halo44 gerichtet und hatte weniger direkt mit deinem Problem zu tun.

Wenn Du etwas nur aus einer Zeile raus haben willst, wirst Du nicht umhin kommen direkt auf die Zeile zu matchen. In diesem Thread hatte robi mir und damit Allen mal sehr gut erklärt wie das geht.
Code:
sed -i '/acl\ allow/s/#\t//' test.txt
sucht nach einer Zeile wo "acl Leerzeichen allow" vor kommt und ersetzt dann #TABULATOR durch NICHTS. Den Match mußt Du natürlich auf etwas in der Zeile einmaliges ausrichten.
 
OP
O

oelk

Member
Hey, cool,
das werd ich gleich heut abend ausprobieren.
An sowas dachte ich. Im Prinzip ist es das.
Muss der Hashtag nicht auch maskiert werden: \# ?

MfG
 
OP
O

oelk

Member
Yippieh,
das war's:
Code:
sed -i '/acl\ allow/s/#//' smb.conf.w7

Vielen Dank.
Was darfs sein? Schokolade, Haribo, wohin?

MfG
 

abgdf

Guru
Geier0815 schrieb:
Wenn Du etwas nur aus einer Zeile raus haben willst, wirst Du nicht umhin kommen direkt auf die Zeile zu matchen. In diesem Thread hatte robi mir und damit Allen mal sehr gut erklärt wie das geht.
Ich weiß nicht: Bei einer komplexen "Suchen und Ersetzen"-Operation in einer ganzen Datei muß man doch auch prüfen, welche Änderungen genau vorgenommen worden sind. Ich brauche da mehr Kontrolle. Ein Einzeiler erscheint mir dafür nicht ausreichend. Der macht zwar irgendwas, aber man kann nicht wirklich sicher sein, ob es auch das ist, was man wollte.
Ich schreibe in solchen Fällen lieber ein längeres Perl-Skript. Na ja, was heißt "länger"? 25 Zeilen vielleicht.
 
Wenn Du ganz auf Nummer Sicher gehen willst, verwendest Du die -i Option NICHT sondern schreibst die Ausgabe in eine neue Datei und machst dann ein Diff auf die originale. Oder Du kopierst dir vorher die Datei oder wie auch immer. Oder Du läßt dir nur die Änderungen auf die Konsole ausgeben, zB innerhalb einer for-Schleife in einem Skript. Solche Einzeiler sind "quick 'n' dirty" wie man es bei perl auch machen kann.
Aber letztlich hast Du Recht: Man sollte evtl. einem Einsteiger etwas mehr an die Hand geben. Dürfte hier aber wohl schon zu spät sein :D
 
OP
O

oelk

Member
@Geier0815
ich nehme alles, was gut ist. Ich muss ja nicht die letzte Lösung nehmen.
Noch ist es nicht zu spät.

MfG
 

abgdf

Guru
Na ja, Perl ist halt 'ne eigene Sprache. Lohnt sich aber zu lernen (z.B. beliebt bei SysAdmins) und macht Spaß. Sähe dann z.B. so aus (Achtung, das Skript schreibt nach "out.txt" im Verzeichnis des Skripts!):
Code:
#!/usr/bin/perl

use warnings;
use strict;

my $infile = "smb.conf";
my $outfile = "out.txt";

open(my $fh, "<", $infile) or die;
my @a = <$fh>;
close($fh);

open(my $fh2, ">", $outfile) or die;

my $x = 1;
foreach my $i (@a) {
    if ($i =~ "acl allow execute") {
        my @b = split("#\t", $i);
        my $i2 = $i; my $b1 = $b[1]; chomp($i2); chomp($b1);
        print "\nChanged Line $x:\n'$i2'\nto\n'$b1'\n\n";
        print $fh2 $b[1];
    }
    else {
        print $fh2 $i;
    }
    $x++;
} 
close($fh2);
Man hat dann halt die volle Kontrolle, was wie geändert und wohin geschrieben wird. Ein wesentlicher Vorteil ist, daß in Perl, anders als in bash, Leerzeichen keine Sonderstellung haben, so daß man nur selten über sie nachdenken muß.
 
Oben